gpt4 book ai didi

javascript - 谁执行 unicode 规范化以及何时执行?

转载 作者:数据小太阳 更新时间:2023-10-29 05:28:37 24 4
gpt4 key购买 nike

根据 JavaScript - 权威指南

JavaScript assumes that the source code it is interpreting has already been normalized and makes no attempt to normalize identifiers, strings, or regular expressions itself.

The Unicode standard defines the preferred encoding for all characters and specifies a normalization procedure to convert text to a canonical form suitable for comparisons.

如果 JS 不规范化 Unicode 那么谁在什么时候做?

如果 JavaScript 不规范化 Unicode,那又如何

"café" === "caf\u00e9"   // => true

为什么是

"café" === "cafe\u0301"   // => false

因为 (\u00e9e\u0301) 都是形成 é 的 Unicode 方式。

最佳答案

您混淆了 unicode 规范化和字符串转义。

"café"

…是由带code points的字符组成的字符串0x63、0x61、0x66、0xe9。

您可以使用转义表示得到完全相同的字符串

"caf\u00e9"
// or even
"\u0063\u0061\u0066\u00e9"
// or why not
"\u0063\u0061fé"

当读取这样的字符串时,javascript 取消转义字符串。也就是说,它用匹配的字符替换转义序列。这是用新行替换“\n”的完全相同的过程。

现在,你的第二个例子实际上是另一个字符串,因为它没有被规范化。它是由字符 0x63、0x61、0x66、0x65、0x301 组成的字符串。由于没有发生规范化,因此它不是同一个字符串。

现在尝试使用相同的字符串,使用您无法使用键盘输入的序列,但我为您复制粘贴到此处:"café"。立即测试:

> a = "café"     // this one is copy-pasted with the combining acute
> b = "café" // this one is typed using the "é" key on my keyboard
> a === "cafe\u0301"
<- true
> b === "cafe\u0301"
<- false
> a === "caf\u00e9"
<- false
> b === "caf\u00e9"
<- true
> a === b
<- false
// Now just making sure...
> a.length
<- 5
> b.length
<- 4

“café”和“café”呈现相同的事实并不能使它们成为相同的字符串。 JavaScript 比较字符串,发现 0x63, 0x61, 0x66, 0xe90x63, 0x61, 0x66, 0x65, 0x301 不同,返回 false。

关于javascript - 谁执行 unicode 规范化以及何时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45268695/

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