string.fromcodepoint 能正确处理增补平面字符(码点 ≥ 0x10000),而 string.fromcharcode 不能;因 js 使用 utf-16 编码,高码点需代理对表示,后者仅接受 16 位值,易致乱码,前者直接生成合法字符。

fromCodePoint 能正确处理多字节字符(即 Unicode 中的增补平面字符,码点 ≥ 0x10000),而 String.fromCharCode 不能——这是它最核心的价值。
为什么需要 fromCodePoint?
JavaScript 字符串内部使用 UTF-16 编码。对于码点在基本多文种平面(BMP,U+0000–U+FFFF)的字符,一个码点对应一个 16 位单元;但超出 BMP 的字符(如大部分 emoji、古文字、数学符号等)需用两个 16 位单元表示,即“代理对”(surrogate pair)。String.fromCharCode 只接受 16 位数值,会把高码点直接截断或错误解释为两个独立的代理单元,导致乱码。
例如:String.fromCharCode(0x1F4A9)(? 的码点 U+1F4A9)返回的是 "\uD83D\uDCA9" 的字面拼接结果,但若你手动传入这两个代理值,它不会自动组合成正确字符;而 String.fromCodePoint(0x1F4A9) 直接生成合法的 ? 字符。
fromCodePoint 的基本用法
它接收一个或多个 Unicode 码点(十进制或十六进制整数),返回对应的字符串:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 支持单个码点:
String.fromCodePoint(0x1F600)→"?" - 支持多个码点:
String.fromCodePoint(0x1F600, 0x1F601, 0x1F602)→"???" - 支持十进制:
String.fromCodePoint(128512)(即 0x1F600)→ 同样是"?" - 不接受 NaN、负数或非整数;会抛出
RangeError或TypeError
与 charCodeAt / codePointAt 的对应关系
它们是一组配套方法:
-
str.codePointAt(index)返回指定位置字符的实际码点(能正确识别代理对,返回完整码点,如 ? 返回 128169) -
String.fromCodePoint(code)是它的逆操作:把码点转回字符 - 而
str.charCodeAt(index)只返回 UTF-16 单元值,遇到代理对会分两次返回高低代理,无法还原原始码点
因此遍历字符串并保留所有字符(尤其含 emoji)时,应优先用 for…of 或配合 codePointAt + fromCodePoint,避免用 charAt 或基于 charCodeAt 的循环。
实际注意事项
虽然 fromCodePoint 解决了高码点问题,但仍有边界情况需留意:
- 浏览器兼容性:IE 完全不支持,现代浏览器(Chrome 41+, Firefox 29+, Safari 10+)均支持;Node.js 4.0+ 支持
- 输入必须是有效 Unicode 码点(U+0000–U+10FFFF);超出范围会报错
- 它不处理字符串解析或编码转换(如 UTF-8 byte array → string),仅用于码点到字符串的映射
- 和
String.fromCharCode并存使用时,建议统一用fromCodePoint,即使处理 BMP 字符也更安全、语义更清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










