gpt4 book ai didi

javascript - String.toLowerCase() 是如何工作的?如何手动创建该功能?

转载 作者:行者123 更新时间:2023-12-04 02:24:21 25 4
gpt4 key购买 nike

要将一个String设置为lowercase,我们只需要在其上调用函数toLowerCase()。但是,对于我现在使用的一种语言,没有这样的功能,所以我需要自己创建一个。 Javascript 如何能够手动实现这一点?

最佳答案

对于 ASCII,它只是一个简单的“获取字母的字符代码,加上 32,你就完成了,因为这就是 ASCII 中数字代码的排列方式”,但你问的是 JavaScript toLowerCase(),这是一个 Unicode 函数:things are complicated .

在 Unicode 领域,不仅有单一的“大写 -> 小写”映射,还有“这个大写字符实际上是另一个大写字符的变体”字母,以及“这个看起来大写的字符是实际上是一个连字,需要分解成多个小写字符”,以及“这个大写字符没有等价的小写字母”,所以实际上一个合适的toLowerCase函数必须检查Unicode 大小写数据,以确定如何将字符串中的每个字符转换为其等效的小写字母(如果存在)。

例如,对于拉丁字符(通常称为“ascii”字符,但事实并非如此:ASCII 是一组恰好 128 个代码,其中很多是不可打印的)我们看到这样的数据:

...
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
...

所以我们看到 A,十六进制代码为 0x41,在代码 0x61 处有一个小写等效项:

...
0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
...

所以对于这组代码,规则是:

if (0x41 <= codepoint <= 0x5A) newcodepoint = codepoint + 0x20

但是,我们只稍微向下移动了列表:

...
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
...

在这里,小写和大写变体紧挨着彼此。加减 32 确实非常是错误的。相反,我们需要使用规则

if (0x0100 <= codepoint <= 0x012E) newcodepoint = codepoint + 1

所以一个真正的 toLowerCase 是一个三阶段函数:

  1. 找到你正在看的 Angular 色所在的“映射集”,然后
  2. 应用该集合的大小写映射规则,注意即使该集合存在,它也可能只映射一种方式,所以
  3. 如果找不到映射,请按照官方 Unicode 建议执行操作。

此外,请注意,在第 1 步中,我们可能需要做比您想象的更多的工作,因为并非每种语言都允许将每个字母盲目映射为单个大写或小写字母:取决于字母在单词中的位置, 可能有不同 大写或小写等价物。只是为了让事情变得更有趣。

文本转换困难,这就是为什么您几乎从不尝试实现自己的版本的原因:这是乍一看似乎非常简单的主题之一,但当您真正坐下来研究时有一点,事实证明这疯狂困难,你真的需要整个团队只写一个函数,这样每个边缘情况都被覆盖并且没有因为你而滑入的错误碰巧错过了关于一些很少使用的字符的小规则。

因此,要回答有关如何为您正在使用的语言实现此功能的问题:您不会。找到一个支持您的语言的字符串库,并记录 toLowerCase() 在您的示例中无法正常工作的浏览器问题,因为这些是需要在其实现中修复的错误。

关于javascript - String.toLowerCase() 是如何工作的?如何手动创建该功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com