1 回答
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
該u?特定"Wu?rzburg"字符串中的 是使用 (U+0075) 的 Unicode 代碼點(diǎn)編寫的u,后跟一個(gè)對其進(jìn)行修改的變音組合標(biāo)記ü(U+0308),但是您要與之比較的是使用單個(gè) Unicode 代碼點(diǎn)編寫的u-with-umlaut (U+00FC)。幾乎所有 JavaScript 的字符串處理都非常簡單,這就是它們不相等的原因。這種幼稚(但很快?。┑男再|(zhì)有兩個(gè)部分:1)它不知道組合標(biāo)記,這就是為什么"Wu?rzburg".length9 而不是 8(如果u?使用 U+0075 和 U+00FC 編寫);和2)JavaScript“字符”實(shí)際上是UTF-16?代碼單元,可能只是一個(gè)代碼點(diǎn)的一半("??".length是 2,例如,因?yàn)殡m然它是單個(gè) Unicode 代碼點(diǎn) (U+1F60A),但它需要兩個(gè)代碼單元才能用 UTF-16 表示)。(有人可能會爭辯說 JavaScript 字符串是UCS-2,因?yàn)樗鼈內(nèi)萑虩o效的代理項(xiàng)對 [代碼單元對一起描述一個(gè)代碼點(diǎn)],但規(guī)范說“......字符串中的每個(gè)元素都被視為UTF-16 編碼單元值..."?)
您可以通過使用normalization比較這兩個(gè)元音變音 u 來解決這個(gè)問題,通過 JavaScript 的(相對較新的)normalize方法:
const word = "Wu?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;
}
在該示例中,我們使用默認(rèn)規(guī)范化(“NFC”,規(guī)范化形式 C),它更喜歡特定代碼點(diǎn)而不是組合標(biāo)記,因此單詞的規(guī)范化版本使用 u-with-umlaut 代碼點(diǎn) U+00FC。normalize通過將參數(shù)傳遞給(例如規(guī)范化形式 D,它更喜歡將標(biāo)記組合到特定字符代碼點(diǎn)),還有其他規(guī)范化形式可用,但默認(rèn)值通常是您想要的。
添加回答
舉報(bào)
