1 回答

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