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

console.log(string1 === string2); // true
console.log(string1.length); // 1
輸出字符串two的字符數(shù)量,其值為一個(gè)。
輸出字符的碼點(diǎn)值,將其轉(zhuǎn)換為十六進(jìn)制形式,然后打印出來,結(jié)果是f1
Unicode標(biāo)準(zhǔn)里,當(dāng)兩個(gè)碼點(diǎn)序列代表同一個(gè)概念符號(hào),并且在部分場(chǎng)合需要當(dāng)作等同物看待,它們就屬于兼容關(guān)系。
所有規(guī)范等價(jià)的序列也是兼容的,但反之不成立。
例如:
在某些情形下,比如排序,可以看作相同,但在某些情形下,比如外觀,則不一樣,所以它們不是真正等同的。
能夠借助 normalize 方法,并選用 "NFKD" 或 "NFKC" 作為參數(shù),就能得出一個(gè)字符串版本,這個(gè)版本在所有兼容的字符串環(huán)境下都是統(tǒng)一的。
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
字符串首先經(jīng)過正規(guī)化處理,轉(zhuǎn)換成標(biāo)準(zhǔn)形式,然后賦值給同一個(gè)變量名,完成更新
字符串string2經(jīng)過NFKD規(guī)范化處理之后,結(jié)果賦值給string2變量,這一步操作是為了消除字符的變體形式,使其標(biāo)準(zhǔn)化

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

字符串經(jīng)過分解處理,變?yōu)槿齻€(gè)組成部分,分別是\u017F、\u0323和\u0307,每個(gè)部分都獨(dú)立存在。
// 兼容組合(NFKC)
拉丁小寫字母 S 的上方和下方各帶有一個(gè)點(diǎn),這個(gè)符號(hào)的 Unicode 編碼是 U+1E69
字符串經(jīng)過正規(guī)化處理后變?yōu)樵撟址碶u1E69
// 兼容分解(NFKD)
// U+0073: 拉丁小寫字母 S
// U+0323: 下方組合一個(gè)點(diǎn)
// U+0307: 上方組合一個(gè)點(diǎn)
字符串經(jīng)過標(biāo)準(zhǔn)化處理之后,變成了\u0073\u0323\u0307這個(gè)形式,其中包含了拆分和組合的字符元素。
Specification
ECMAScript? 2026版本 語言 規(guī)范
字符串原型中的規(guī)范化解構(gòu)方法
Loading…