String.fromCharCode() 是 JS 根据 UTF-16 编码单元生成字符的静态方法,仅支持 ≤0xFFFF 码点;处理 ≥0x10000 码点需手动拆分代理对,推荐优先使用更安全的 String.fromCodePoint()。

String.fromCharCode() 是 JavaScript 中用于根据 Unicode 码点(十进制数值)生成对应字符的静态方法。它接收一个或多个数字参数,每个数字代表一个 UTF-16 编码单元(注意:不是所有码点都等同于一个字符,尤其涉及代理对时需谨慎)。
基本用法:单个和多个码点
传入一个数字,返回对应的单个字符;传入多个数字,返回由这些字符拼接成的字符串:
-
String.fromCharCode(65)→"A" -
String.fromCharCode(97, 98, 99)→"abc" -
String.fromCharCode(0x2603, 0x2602)→"☃☂"(雪人、伞符号)
注意:只支持 UTF-16 编码单元,不直接处理大于 0xFFFF 的码点
对于 Unicode 码点 ≥ 0x10000(如 emoji 或部分汉字),UTF-16 使用两个编码单元(代理对)。fromCharCode() 无法直接识别一个高码点,必须手动拆分为高位和低位代理:
-
0x1F600(?)不能直接写String.fromCharCode(0x1F600)(会得到错误字符) - 正确做法是先用
String.fromCodePoint(0x1F600)(推荐替代方案) - 若坚持用
fromCharCode,需手动计算代理对:const hi = Math.floor((0x1F600 - 0x10000) / 0x400) + 0xD800;const lo = (0x1F600 - 0x10000) % 0x400 + 0xDC00;String.fromCharCode(hi, lo)→"?"
与 String.fromCodePoint() 的关键区别
fromCodePoint() 是 ES6 新增方法,可直接接受任意合法 Unicode 码点(包括 > 0xFFFF 的),更直观安全:
立即学习“Java免费学习笔记(深入)”;
-
String.fromCodePoint(65)→"A" -
String.fromCodePoint(0x1F600, 0x1F469, 0x200D, 0x1F469)→"???"(支持组合 emoji) - 遇到无效码点(如负数、超限值)会抛出
RangeError,而fromCharCode()会对输入取模(如fromCharCode(-1)相当于fromCharCode(65535)),行为不易预测
实际使用建议
- 日常开发优先使用
String.fromCodePoint(),语义清晰、兼容现代环境(Node.js 4+,主流浏览器均支持) - 仅在需兼容极老运行时(如 IE8)且确定只处理 BMP 字符(U+0000–U+FFFF)时,才用
fromCharCode() - 从字符串中提取码点应配合
.codePointAt()(而非.charCodeAt()),以正确处理代理对










