JavaScript中Unicode字符与编码的互转

冷不防 2024-04-17 13:53 149阅读 0赞

说起 Unicode 字符与编码的互转,我们很容易想到 charCodeAtfromCharCode 两个方法。

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

注意:charCodeAtString 的原型方法,fromCharCodeString 的静态方法,它们的使用方式是不同的。

用法:

  1. 'A'.charCodeAt(); // 65
  2. String.fromCharCode(65); // "A"
  3. 复制代码

很简单对吧?一个是 charCode 的 “at”,即字符的编码位于哪里;另一个是 charCode 的 “from”,即从编码找出对应的字符,容易理解和记忆。然而当我们遇到某些特殊字符时就出问题了:

  1. '?'.charCodeAt(); // 55357
  2. String.fromCharCode(55357); // "�"
  3. '?'.charCodeAt(); // 55360
  4. String.fromCharCode(55360); // "�"
  5. 复制代码

可以看到我们无法通过获取的编码还原出字符,这是因为上面的 ?? 都是 4 字节字符(length 长度为 2 而不是 1),它们各自的 Unicode 编码有 2 组,所以要获取完整的编码值得这样写:

  1. '?'.charCodeAt(0); // 前两个字节的值:55357
  2. '?'.charCodeAt(1); // 后两个字节的值:56960
  3. '?'.charCodeAt(0); // 前两个字节的值:55360
  4. '?'.charCodeAt(1); // 后两个字节的值:56743
  5. 复制代码

如何将上面这种 4 字节组成的 charCode 值解析为字符串呢?需要将 2 组编码都传入 fromCharCode 中进行解析:

  1. String.fromCharCode(55357, 56960); // "?"
  2. String.fromCharCode(55360, 56743); // "?"
  3. 复制代码

这在实际使用时会很不便,我们需要手动判断字符是否为 4 字节字符,还需要做相应处理,好在 ES6 中新增了 codePointAtfromCodePoint 两个 API 来解决这个问题,它们的使用方法和原有的 charCodeAtfromCharCode 基本一致:

  1. 'A'.codePointAt(); // 65
  2. String.fromCodePoint(65); // "A"
  3. '?'.codePointAt(); // 128640
  4. String.fromCodePoint(128640); // "?"
  5. '?'.codePointAt(); // 131495
  6. String.fromCodePoint(131495); // "?"
  7. 复制代码

charCodeAt

fromCodePoint

转载于:https://juejin.im/post/5d5a82b1e51d4561ae4da619

发表评论

表情:
评论列表 (有 0 条评论,149人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaScript汉字Unicode编码

    在JavaScript编程开发中,我们常常需要将汉字转换为Unicode编码,以便于在不同平台和设备上正确显示和处理中文字符。Unicode是一种通用的字符编码标准,可以表示几