如何在JavaScript中将表情符号转为Unicode码点?含转1f600问题
解决JavaScript中表情符号转Unicode码点的问题
这个问题我之前也碰到过!原因是大部分表情符号属于Unicode的补充平面,在UTF-16里是用代理对(两个16位字符)来表示的,charCodeAt()只能拿到其中一个代理项的数值,所以才会返回55357而不是你要的0x1F600。下面给你详细的解决思路和方法:
为什么charCodeAt(0)返回55357?
像😀这类表情符号的Unicode码点是U+1F600,数值为128512,超过了UTF-16单字符能表示的最大范围(0xFFFF,即65535)。因此它会被拆分成两个代理字符:
- 高代理项:
U+D83D(对应数值55357) - 低代理项:
U+DE00(对应数值56832)charCodeAt(0)只能获取第一个代理项的数值,自然无法得到完整的目标码点。
两种获取完整Unicode码点的方法
方法1:使用ES6的codePointAt()(推荐)
这个方法就是专门为处理超过0xFFFF的Unicode字符设计的,能直接返回完整的码点数值:
const emoji = '😀'; const codePoint = emoji.codePointAt(0); console.log(codePoint); // 输出 128512 console.log(codePoint.toString(16)); // 输出 '1f600'(转成十六进制字符串)
方法2:手动计算代理对
如果需要兼容ES6之前的运行环境,可以用代理对的公式手动计算完整码点:
完整码点 = (高代理项 - 0xD800) * 0x400 + 低代理项 - 0xDC00 + 0x10000
代码示例:
const emoji = '😀'; const highSurrogate = emoji.charCodeAt(0); // 55357 (0xD83D) const lowSurrogate = emoji.charCodeAt(1); // 56832 (0xDE00) const codePoint = (highSurrogate - 0xD800) * 0x400 + lowSurrogate - 0xDC00 + 0x10000; console.log(codePoint.toString(16)); // 输出 '1f600'
内容的提问来源于stack exchange,提问作者Parth Gajjar
相关产品推荐
相关产品推荐

