String.fromCharCode() 无法直接处理四字节 Unicode 码点,因其仅接受 16 位数值、不自动组合代理对;应使用 String.fromCodePoint() 或手动计算代理对实现兼容。

String.fromCharCode() 只能直接处理 0–65535(即 U+0000 到 U+FFFF)范围内的码点,也就是基本多文种平面(BMP)内的字符。它无法直接生成超出此范围的 Unicode 字符(如大部分 emoji、古文字、数学符号等),因为这些字符在 UTF-16 中以代理对(surrogate pair)形式表示。
为什么 fromCharCode 不能直接处理四字节 Unicode?
JavaScript 内部使用 UTF-16 编码字符串。U+10000 及以上的码点(如 ? U+1F30D、?? U+1F4BB)在 UTF-16 中需用两个 16 位码元(即代理对:高位代理 + 低位代理)表示。而 fromCharCode() 接收的是多个 16 位数值,它只是把每个参数当作一个独立的 UTF-16 码元拼接,并不自动计算或组合代理对。
例如:
// 错误:直接传入 U+1F30D(地球 emoji)会得到乱码或无效字符String.fromCharCode(0x1F30D); // → 'ߍ'(不是?)
这是因为 0x1F30D 超出 16 位范围,被截断为 0xF30D(落在希腊字母区)。
正确处理任意 Unicode 码点的方法
要安全生成任意 Unicode 字符(包括补充平面字符),应使用 String.fromCodePoint() —— 它是 ES6 新增的标准方法,原生支持 21 位 Unicode 码点(U+0000 至 U+10FFFF):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
String.fromCodePoint(0x1F30D)→"?" -
String.fromCodePoint(0x1F4BB, 0x200D, 0x1F4BC)→"??"(带零宽连接符的组合 emoji) - 支持单个或多个码点,返回完整字符串
兼容旧环境的 fallback 方案(仅当必须用 fromCharCode)
若需兼容不支持 fromCodePoint 的老旧运行时(如 IE),可手动将码点转为代理对再传给 fromCharCode:
立即学习“Java免费学习笔记(深入)”;
- 对码点
cp >= 0x10000,计算高位代理high = Math.floor((cp - 0x10000) / 0x400) + 0xD800 - 计算低位代理
low = (cp - 0x10000) % 0x400 + 0xDC00 - 然后调用
String.fromCharCode(high, low) - 例如:
cp = 0x1F30D→high = 0xD83C,low = 0xDF0D→String.fromCharCode(0xD83C, 0xDF0D) === "?"
实际开发中的建议
- 优先使用
String.fromCodePoint(),语义清晰、无兼容风险(现代浏览器和 Node.js ≥ 4 均支持) - 避免用
fromCharCode处理大于 0xFFFF 的数值——它不是设计用来做这事的 - 解析字符串时,注意
.length和[i]对代理对的处理(一个 emoji 可能占两个索引位置),推荐用Array.from(str)或for...of遍历真正字符

















