JavaScript中Unicode字符與編碼的互轉

提及 Unicode 字符與編碼的互轉,咱們很容易想到 charCodeAtfromCharCode 兩個方法。ui

  • String.prototype.charCodeAt()
  • String.fromCharCode()

注意:charCodeAtString 的原型方法,fromCharCodeString 的靜態方法,它們的使用方式是不一樣的。編碼

用法:spa

'A'.charCodeAt();  // 65
String.fromCharCode(65);  // "A"
複製代碼

很簡單對吧?一個是 charCode 的 「at」,即字符的編碼位於哪裏;另外一個是 charCode 的 「from」,即從編碼找出對應的字符,容易理解和記憶。然而當咱們遇到某些特殊字符時就出問題了:prototype

'🚀'.charCodeAt();  // 55357
String.fromCharCode(55357);  // "�"

'𠆧'.charCodeAt();  // 55360
String.fromCharCode(55360);  // "�"
複製代碼

能夠看到咱們沒法經過獲取的編碼還原出字符,這是由於上面的 🚀𠆧 都是 4 字節字符(length 長度爲 2 而不是 1),它們各自的 Unicode 編碼有 2 組,因此要獲取完整的編碼值得這樣寫:code

'🚀'.charCodeAt(0);  // 前兩個字節的值:55357
'🚀'.charCodeAt(1);  // 後兩個字節的值:56960

'𠆧'.charCodeAt(0);  // 前兩個字節的值:55360
'𠆧'.charCodeAt(1);  // 後兩個字節的值:56743
複製代碼

如何將上面這種 4 字節組成的 charCode 值解析爲字符串呢?須要將 2 組編碼都傳入 fromCharCode 中進行解析:ip

String.fromCharCode(55357, 56960);  // "🚀"
String.fromCharCode(55360, 56743);  // "𠆧"
複製代碼

這在實際使用時會很不便,咱們須要手動判斷字符是否爲 4 字節字符,還須要作相應處理,好在 ES6 中新增了 codePointAtfromCodePoint 兩個 API 來解決這個問題,它們的使用方法和原有的 charCodeAtfromCharCode 基本一致:字符串

'A'.codePointAt();  // 65
String.fromCodePoint(65);  // "A"

'🚀'.codePointAt();  // 128640
String.fromCodePoint(128640);  // "🚀"

'𠆧'.codePointAt();  // 131495
String.fromCodePoint(131495);  // "𠆧"
複製代碼

charCodeAtget

fromCodePoint原型

相關文章
相關標籤/搜索