Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

codePointAt 与四字节字符

  在 JavaScript 中,字符串都是以 UTF-16 的形式来处理的,而四字节字符串在 UTF-16 的表现方式就是使用代理区的编码,通过两个 UTF-16 字符来描述一个四字节字符。所以四自己字符的 length 会被统计成 2,而且 charCodeAt 这个方法也只会取到一般的代理区字符,不会解析代理区。
'😂'.length; // 2 '😂'.charCodeAt(0).toString(2); // 1101100000111101 '😂'.charCodeAt(1).toString(2); // 1101111000000010   如果把这两个二进制的后 10 位取出来拼接在一起,再加上 0x10000 即可得到这个字符的 Unicode,比如 parseInt( '1101100000111101'.slice(-10) + '1101111000000010'.slice(-10) , 2) + 0x10000; // 128514   是不是复杂成狗了呢?如果引擎支持 codePointAt 这个字符串方法的话,其实直接调用就可以得到。比如 '😂'.codePointAt(0); // 128514   但是 codePointAt 这个方法的参数这个数值并不是 Unicode 字符个数,依然是根据 UTF-16 来计算的,所以 '😂'.codePointAt(1) === '😂'.charCodeAt(1); // true   之前本来想看看「😂」字符的 Unicode 是什么,结果网络上搜到的所谓「Unicode 转换」全都是用 charCodeAt 的,没有考虑 4 字节字符,所以都是错的。后来想想,浏览器似乎已经支持 codePointAt 了,于是成功通过浏览器控制台得到了字符的 Unicode。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^