更新時間:2025-08-21 11:58:57作者:佚名
名字是字母組成的字符串,包含了多個字符,這個字符串由若干個字符單元構成,每個單元代表一個字符,整體上它是一個字符序列,內部由多個字符元素拼接而成。
那個變量叫name2, 它的值是字母A, 加上帶重音的e, 再加上字母l, i, 和h。
輸出名字,第一個是name1,第二個是name2。
阿梅莉,阿梅莉
console.log(name1 === name2);
// Expected output: false
輸出name1的字符數量是否與name2的字符數量相等
// Expected output: false
名稱一經過正規化處理,轉換成了標準形式,結果存儲在變量name1NFC中。
名稱二經過正規化處理,轉換成了NFC格式
輸出姓名一和姓名二, 姓名一為name1NFC, 姓名二為name2NFC, 兩者之間用逗號連接
// Expected output: "Amélie, Amélie"
輸出結果為真,當且僅當第一個名稱與第二個名稱相同時,請檢查名稱是否一致,名稱1是name1NFC,名稱2是name2NFC
// Expected output: true
檢查name1NFC的長度是否和name2NFC的長度相等
// Expected output: true
normalize()
normalize(form)
屬于 "NFC"、"NFD"、"NFKC" 或者 "NFKD" 這四種類型之一,目的是明確 Unicode 的標準化形態。倘若沒有提供,或者填寫為空白,那么默認采用 "NFC"。
這些值具有以下含義:
規范分解,然后進行規范組合。
規范分解。
兼容分解,然后進行規范組合。
兼容分解。
一個包含給定字符串的 Unicode 標準化形式的字符串。
如果 form 不是上述指定的值之一,將拋出該異常。
Unicode 為每一個字符設定了獨一無二的數字,這個數字叫做碼位,比如字母 "A" 的碼位記作 U+0041。不過,有時候一個抽象的字符可以由一個碼位或者碼位組合來呈現,例如字母 "?" 就可以用以下任何一種形式來編碼:
const string1 = "\u00F1";
那個字符表示字母N帶鉤,是特殊變體形式
console.log(string1); // ?
console.log(string2); // ?
但是,因為編碼不同,文本對比不會將它們看作一樣。而且,因為各個版本中的編碼數量不一樣,它們甚至有不同的篇幅。
那個字符由兩個部分組成,第一個部分是拉丁字母n,第二個部分是一個附加符號,它位于n的上方,整體看起來像是一個帶有特殊標記的字母n。
那個字符由字母N和加上的變音符號組合而成,它表示西班牙語中的特殊音素,在Unicode編碼里被詳細記錄,其形式為特定的字符序列,通常用于表示帶有鼻音的發音,在文字處理時需要特別注意它的正確顯示和輸入,這個符號在多種語言文字中都有應用,是國際音標系統的一部分,用于精確描述語音特征,它區別于普通字母N的發音,是語言多樣性的體現,在計算機編碼中占有獨特的位置,需要特定的代碼來準確表示,這個變音符號賦予了字母新的讀音,豐富了語言的表達能力,在書寫規范中有著明確的定義和使用規則,它確保了語言記錄的準確性和一致性,是文字系統的重要組成部分。
輸出兩個字符串是否相等的結果,結果為不成立。
輸出字符串一的總數,即它的字符個數。
輸出字符串二的總數,其值為兩。
歸一化函數能夠將文本調整為統一形態,這種統一形態適用于所有代表相同字符的碼點組合,有助于處理相關事宜,主要存在兩種歸一化方式,一種是遵循規范等價原則留學之路,另一種則是依據兼容性規則
Unicode 規定,當兩個碼位序列代表同一個抽象字符時,它們必須表現出完全一致的外部形態和功能特性,比如排序順序必須完全相同,這種情況就稱這兩個序列為規范等價。
能夠借助 normalize() 方法并選用 "NFD" 或 "NFC" 參數,可以得出一個字符串版本normalize是什么意思,這個版本對所有規范相等的字符串都具備統一性。接下來,我們來看字符 "?" 的兩種不同書寫方式如何經過標準化處理。
let string1 = "\u00F1"; // ?
把字符串賦值為那個帶變音符號的字符,就是那個拉丁字母N帶勾,記作?
字符串string1經過NFD規范化處理后,會轉換成新的形式,這個新形式包含了所有原始字符的分解形式,并且會替換掉那些在分解過程中產生的特殊字符,最終得到一個更加標準化的字符串結果。
字符串string2經過NFD規范化后得到新結果,這個新結果賦值給變量string2,表示當前字符串已經更新為規范分解形式,這種處理方式有助于后續的字符比較和搜索操作,特別是在處理包含重音符號的文本時更為有效
輸出兩個字符串是否完全一致的結果,結果為真
輸出字符串一的總數,等于兩
console.log(string2.length); // 2
組合和分解形式
在 NFD 這種情況下,標準形式的字符數是兩個,原因是 NFD 提供了字符的分解形態,一個碼位會被分解成好幾個組合碼位。就拿 ? 來說,它的分解規范形式由 \u006E 和 \u0303 這兩個部分構成。
可以選用 "NFC" 來取得合并后的標準寫法,這種寫法會把多個字符位normalize是什么意思,在條件允許時合并成一個字符位。"?" 的合并后的標準寫法是 "\u00F1"。
let string1 = "\u00F1"; // ?
let string2 = "\u006E\u0303"; // ?
字符串string1經過NFC規范化后,結果賦值給string1本身,這個操作完成了字符串的標準化處理
字符串string2經過NFC規范化處理之后,結果賦值給string2這個變量名

console.log(string1 === string2); // true
console.log(string1.length); // 1
輸出字符串two的字符數量,其值為一個。
輸出字符的碼點值,將其轉換為十六進制形式,然后打印出來,結果是f1
Unicode標準里,當兩個碼點序列代表同一個概念符號,并且在部分場合需要當作等同物看待,它們就屬于兼容關系。
所有規范等價的序列也是兼容的,但反之不成立。
例如:
在某些情形下,比如排序,可以看作相同,但在某些情形下,比如外觀,則不一樣,所以它們不是真正等同的。
能夠借助 normalize 方法,并選用 "NFKD" 或 "NFKC" 作為參數,就能得出一個字符串版本,這個版本在所有兼容的字符串環境下都是統一的。
let string1 = "\uFB00";
let string2 = "\u0066\u0066";
console.log(string1); // ?
console.log(string2); // ff
console.log(string1 === string2); // false
console.log(string1.length); // 1
console.log(string2.length); // 2
字符串首先經過正規化處理,轉換成標準形式,然后賦值給同一個變量名,完成更新
字符串string2經過NFKD規范化處理之后,結果賦值給string2變量,這一步操作是為了消除字符的變體形式,使其標準化

console.log(string1); // ff <- 視覺外觀改變了
console.log(string2); // ff
console.log(string1 === string2); // true
console.log(string1.length); // 2
console.log(string2.length); // 2
應用兼容性標準化時,必須考慮具體使用場景,因為統一格式未必適配所有軟件。比如搜索功能,標準化能幫助用戶輸入 "f" 就檢索到相關內容。然而顯示環節則未必適用,畢竟視覺呈現方式與搜索邏輯不同。
同規范化和標準化一樣,你可以通過單獨輸入 "NFKD" 或 "NFKC" 來獲取兼容性分解或組合形式。
// 初始字符串
// U+1E9B: 上方帶一個點的拉丁小寫字母長 S
// U+0323: 下方組合一個點
const str = "\u1E9B\u0323";
// 規范組合形式(NFC)
// U+1E9B: 上方帶一個點的拉丁小寫字母長 S
// U+0323: 下方組合一個點
字符串經過正規化處理后,變成了這個形式,包含了特定的字符組合
str.normalize(); // 同上
// 規范分解形式(NFD)
// U+017F: 拉丁小寫字母長 S
// U+0323: 下方組合一個點
// U+0307: 上方組合一個點

字符串經過分解處理,變為三個組成部分,分別是\u017F、\u0323和\u0307,每個部分都獨立存在。
// 兼容組合(NFKC)
拉丁小寫字母 S 的上方和下方各帶有一個點,這個符號的 Unicode 編碼是 U+1E69
字符串經過正規化處理后變為該字符,即\u1E69
// 兼容分解(NFKD)
// U+0073: 拉丁小寫字母 S
// U+0323: 下方組合一個點
// U+0307: 上方組合一個點
字符串經過標準化處理之后,變成了\u0073\u0323\u0307這個形式,其中包含了拆分和組合的字符元素。
Specification
ECMAScript? 2026版本 語言 規范
字符串原型中的規范化解構方法
Loading…