前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题-Unicode字符与编码如何互转

面试题-Unicode字符与编码如何互转

作者头像
用户10106350
发布2022-10-28 11:24:13
3880
发布2022-10-28 11:24:13
举报
文章被收录于专栏:WflynnWeb

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

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

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

用法:

代码语言:javascript
复制
'A'.charCodeAt();  // 65
String.fromCharCode(65);  // "A"

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

代码语言:javascript
复制
'🚀'.charCodeAt();  // 55357
String.fromCharCode(55357);  // "�"

'𠆧'.charCodeAt();  // 55360
String.fromCharCode(55360);  // "�"

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

代码语言:javascript
复制
'🚀'.charCodeAt(0);  // 前两个字节的值:55357
'🚀'.charCodeAt(1);  // 后两个字节的值:56960

'𠆧'.charCodeAt(0);  // 前两个字节的值:55360
'𠆧'.charCodeAt(1);  // 后两个字节的值:56743

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

代码语言:javascript
复制
String.fromCharCode(55357, 56960);  // "🚀"
String.fromCharCode(55360, 56743);  // "𠆧"

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

代码语言:javascript
复制
'A'.codePointAt();  // 65
String.fromCodePoint(65);  // "A"

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

'𠆧'.codePointAt();  // 131495
String.fromCodePoint(131495);  // "𠆧"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WflynnWeb 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档