要将 a 设置String为lowercase,我们只需要调用toLowerCase()它的函数即可。但是,对于我现在正在使用的一种语言,没有这样的功能,所以我需要自己创建一个。Javascript 是如何手动实现的?
对于 ASCII 来说,它只是一个简单的“取字母的字符代码,加上 32,你就完成了,因为 ASCII 中的数字代码是这样排列的”,但是你问的是 JavaScript toLowerCase(),它是一个Unicode函数:事情很复杂.
在 unicode 领域,不仅有单一的“大写 -> 小写”映射,还有“这个大写字符实际上是另一个大写字符的变体”字母,以及“这个看起来大写的字符实际上是一个连字”并且需要分解成多个小写字符”,以及“这个大写字符没有小写等效字符”,所以实际上一个适当的toLowerCase函数必须检查 Unicode 大小写数据,以确定如何将字符串中的每个字符转换为其小写等效字符,如果存在。
例如,对于拉丁字符(通常称为“ascii”字符,但事实并非如此:ASCII 是一组正好 128 个代码,其中很多是不可打印的)我们看到如下数据:
...
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
...
Run Code Online (Sandbox Code Playgroud)
所以我们看到A,十六进制代码为 0x41 的 ,在代码 0x61 处有一个小写的等价物:
...
0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
...
Run Code Online (Sandbox Code Playgroud)
所以对于这组代码,规则是:
if (0x41 <= codepoint <= 0x5A) newcodepoint = codepoint + 0x20
Run Code Online (Sandbox Code Playgroud)
但是,我们看到的列表仅稍微向下移动:
...
012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
...
Run Code Online (Sandbox Code Playgroud)
在这里,小写和大写变体彼此相邻。加减 32确实是非常错误的。相反,我们需要使用规则
if (0x0100 <= codepoint <= 0x012E) newcodepoint = codepoint + 1
Run Code Online (Sandbox Code Playgroud)
所以实数toLowerCase是一个三阶段函数:
另外,请注意,在第 1 步中,我们可能需要做比您想象的更多的工作,因为并非每种语言都允许将每个字母盲目地映射为单个大写或小写:取决于字母在单词中的位置,可能有是不同的大写或小写等价物。只是为了让事情变得更有趣。
文本转换很难,这就是为什么您几乎从不尝试实现自己的版本的原因:这是乍一看似乎非常简单的主题之一,但是当您真正坐下来研究它时,发现它非常困难你真的需要一个完整的团队来编写一个函数,这样才能涵盖所有边缘情况,并且不会因为你碰巧错过了一些很少使用的字符的小规则而导致错误。
因此,要回答关于您将如何为您正在使用的语言实现这一点的问题:您没有。找到一个支持您的语言的字符串库,并toLowerCase()为您的示例无法正常工作的浏览器文件问题,因为这些是需要在其实现中修复的错误。
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |