1 回答
TA贡献1815条经验 获得超10个赞
该ü
特定"Würzburg"
字符串中的 是使用 (U+0075) 的 Unicode 代码点编写的u
,后跟一个对其进行修改的变音组合标记ü
(U+0308),但是您要与之比较的是使用单个 Unicode 代码点编写的u-with-umlaut (U+00FC)。几乎所有 JavaScript 的字符串处理都非常简单,这就是它们不相等的原因。这种幼稚(但很快!)的性质有两个部分:1)它不知道组合标记,这就是为什么"Würzburg".length
9 而不是 8(如果ü
使用 U+0075 和 U+00FC 编写);和2)JavaScript“字符”实际上是UTF-16 代码单元,可能只是一个代码点的一半("😊".length
是 2,例如,因为虽然它是单个 Unicode 代码点 (U+1F60A),但它需要两个代码单元才能用 UTF-16 表示)。(有人可能会争辩说 JavaScript 字符串是UCS-2,因为它们容忍无效的代理项对 [代码单元对一起描述一个代码点],但规范说“......字符串中的每个元素都被视为UTF-16 编码单元值..." )
您可以通过使用normalization比较这两个元音变音 u 来解决这个问题,通过 JavaScript 的(相对较新的)normalize
方法:
const word = "Würzburg";
// Iteration moves through the string by code points, not code units
for (const ch of word) {
console.log(`${ch} = ${ch.codePointAt(0)}`);
}
const char = String.fromCharCode(252);
const normalizedWord = word.normalize();
const normalizedChar = char.normalize();
// Using iteration to grab the second "character" (code point) from the string
const [, secondCharOfWord] = normalizedWord;
console.log(normalizedChar === secondCharOfWord); // true
.as-console-wrapper {
max-height: 100% !important;
}
在该示例中,我们使用默认规范化(“NFC”,规范化形式 C),它更喜欢特定代码点而不是组合标记,因此单词的规范化版本使用 u-with-umlaut 代码点 U+00FC。normalize
通过将参数传递给(例如规范化形式 D,它更喜欢将标记组合到特定字符代码点),还有其他规范化形式可用,但默认值通常是您想要的。
添加回答
举报