You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:20