提及 Unicode 字符與編碼的互轉,咱們很容易想到 charCodeAt
和 fromCharCode
兩個方法。ui
String.prototype.charCodeAt()
String.fromCharCode()
注意:
charCodeAt
是String
的原型方法,fromCharCode
是String
的靜態方法,它們的使用方式是不一樣的。編碼
用法: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 中新增了 codePointAt
和 fromCodePoint
兩個 API 來解決這個問題,它們的使用方法和原有的 charCodeAt
和 fromCharCode
基本一致:字符串
'A'.codePointAt(); // 65
String.fromCodePoint(65); // "A"
'🚀'.codePointAt(); // 128640
String.fromCodePoint(128640); // "🚀"
'𠆧'.codePointAt(); // 131495
String.fromCodePoint(131495); // "𠆧"
複製代碼
charCodeAtget