codePointAt() 和 String.fromCodePoint()

codePointAt()

JavaScript 內部,字符串以UTF-16的格式存儲,每個字符固定爲2個字節.對於那些需要4個字節存儲的字符,(Unicode碼點大於
0xFFFF的字符) , JavaScript會認爲它們是兩個字符。

> var s = "𠮷"
undefined
> s
'𠮷'
> s.length
2
> s.charAt(0)
'�'
> s.charAt(1)
'�'
> s.charCodeAt(0)
55362
> s.charCodeAt(1)
57271
> 

上面代碼中, 漢字“”的碼點是 0x20BB7 , UTF-16編碼爲 0xD842 0xDFB7 (十進制爲55362 57271) , 需要4個字節儲存。 對
於這種4個字節的字符, JavaScript不能正確處理, 字符串長度會誤判爲2, 而且 charAt 方法無法讀取整個字
符, charCodeAt 方法只能分別返回前兩個字節和後兩個字節的值。

 

ES6提供了 codePointAt 方法, 能夠正確處理4個字節儲存的字符, 返回一個字符的碼點。

> var s = "𠮷s"
undefined
> s
'𠮷s'
> s.codePointAt(0)
134071
> s.codePointAt(1)
57271
> s.codePointAt(2)
115
> 

codePointAt 方法的參數, 是字符在字符串中的位置(從0開始) 。 上面代碼中, JavaScript將“a”視爲三個字
符, codePointAt方法在第一個字符上, 正確地識別了“”, 返回了它的十進制碼點134071(即十六進制的 20BB7 ) 。 在第二
個字符(即“”的後兩個字節) 和第三個字符“a”上, codePointAt 方法的結果與 charCodeAt 方法相同。
總之, codePointAt 方法會正確返回32位的UTF-16字符的碼點。 對於那些兩個字節儲存的常規字符, 它的返回結果
與 charCodeAt 方法相同。

使用 for...of 循環,正確識別 32位的UTF-16字符:

> var s = "𠮷s"
undefined
> for(let ch of s) {
... console.log(ch.codePointAt(0))
... }
134071
115

String.fromCodePoint()

   可以識別大於 0xFFFF 的碼點,功能和 codePointAt() 相反

> String.fromCodePoint(0x20BB7)
'𠮷'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章