谁执行 unicode 标准化以及何时执行?

2024-01-01

根据JavaScript - 权威指南,

JavaScript 假定它正在解释的源代码已经标准化,并且不会尝试标准化标识符、字符串或正则表达式本身。

Unicode 标准定义了所有字符的首选编码,并指定了将文本转换为适合比较的规范形式的规范化过程。

如果 JS 没有对 Unicode 进行规范化,那么谁会在何时规范化呢?

如果 JavaScript 没有规范化 Unicode,那么怎么办?

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

为什么是

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

由于两者(\u00e9 and e\u0301) 是 Unicode 的形成方式é.


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

"café"

…是由字符组成的字符串代码点 https://en.wikipedia.org/wiki/Code_point0x63、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, 0xe9不等于0x63, 0x61, 0x66, 0x65, 0x301并返回 false。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁执行 unicode 标准化以及何时执行? 的相关文章

随机推荐