提及 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