標籤:標記法 自動識別 允許 文章 字串 簡單的 兩種方法 長度 解決
參考文章:
http://www.ruanyifeng.com/blog/2014/12/unicode.html
Unicode源於一個很簡單的想法:將全世界所有的字元包含在一個集合裡,電腦只要支援這一個字元集,就能顯示所有的字元,再也不會有亂碼了。
它從0開始,為每個符號指定一個編號,這叫做"碼點"(code point)。
U+0000 = null
U+表示緊跟在後面的十六進位數是Unicode的碼點。
JavaScript語言採用Unicode字元集,但是只支援一種編碼方法。
JavaScript用的是UCS-2!
由於JavaScript只能處理UCS-2編碼,造成所有字元在這門語言中都是2個位元組,如果是4個位元組的字元,會當作兩個雙位元組的字元處理。JavaScript的字元函數都受到這一點的影響,無法返回正確結果。
JavaScript的下一個版本ECMAScript 6(簡稱ES6),大幅增強了Unicode支援,基本上解決了這個問題。
(1)正確識別字元
ES6可以自動識別4位元組的碼點。因此,遍曆字串就簡單多了。
for (let s of string ) { // ...}
但是,為了保持相容,length屬性還是原來的行為方式。為了得到字串的正確長度,可以用下面的方式。
Array.from(string).length
(2)碼點標記法
JavaScript允許直接用碼點表示Unicode字元,寫法是"反斜線+u+碼點"。
‘好‘ === ‘\u597D‘ // true
但是,這種標記法對4位元組的碼點無效。ES6修正了這個問題,只要將碼點放在大括弧內,就能正確識別。
(3)字串處理函數
ES6新增了幾個專門處理4位元組碼點的函數
- String.fromCodePoint():從Unicode碼點返回對應字元
- String.prototype.codePointAt():從字元返回對應的碼點
- String.prototype.at():返回字串給定位置的字元
(4)Regex
ES6提供了u修飾符,對Regex添加4位元組碼點的支援。
(5)Unicode正規化
有些字元除了字母以外,還有附加符號。比如,漢語拼音的ǒ,字母上面的聲調就是附加符號。對於許多歐洲語言來說,聲調符號是非常重要的。
Unicode提供了兩種表示方法。一種是帶附加符號的單個字元,即一個碼點表示一個字元,比如ǒ的碼點是U+01D1;另一種是將附加符號單獨作為一個碼點,與主體字元複合顯示,即兩個碼點表示一個字元,比如ǒ可以寫成O(U+004F) + ˇ(U+030C)。
// 方法一‘\u01D1‘// ‘ǒ‘// 方法二‘\u004F\u030C‘// ‘ǒ‘
這兩種表示方法,視覺和語義都完全一樣,理應作為等同情況處理。但是,JavaScript無法辨別。
‘\u01D1‘===‘\u004F\u030C‘ //false
ES6提供了normalize方法,允許"Unicode正規化",即將兩種方法轉為同樣的序列。
‘\u01D1‘.normalize() === ‘\u004F\u030C‘.normalize() // true
Unicode與JavaScript詳解