JavaScript字符串默认UTF-16编码,BMP字符占1个代码单元,辅助平面字符用代理对表示;.charCodeAt()返回代码单元值,.codePointAt()返回完整Unicode码点,for...of可正确遍历字符。
javascript 中字符串默认使用 utf-16 编码,每个字符对应一个 16 位代码单元(code unit),但 unicode 中超出基本多文种平面(bmp)的字符(如某些 emoji 或古文字)会以两个代码单元组成的代理对(surrogate pair)表示。因此,直接用 .charcodeat() 或 .codepointat() 查询编码时,结果取决于你想要的是代码单元值还是真正的 unicode 码点。
查单个字符的 UTF-16 代码单元(兼容旧 API)
.charCodeAt(index) 返回指定位置的 UTF-16 代码单元值(0–65535)。对 BMP 字符(U+0000–U+FFFF)准确;对辅助平面字符(如 "?"),它只返回代理对中的高位或低位,不能单独代表该字符。
-
"A".charCodeAt(0)→ 65 -
"?".charCodeAt(0)→ 55357(高位代理) -
"?".charCodeAt(1)→ 56832(低位代理)
查真正的 Unicode 码点(推荐用于现代开发)
.codePointAt(index) 正确返回任意字符(包括辅助平面字符)的完整 Unicode 码点(U+0000 到 U+10FFFF),返回数值类型,支持 Number.isInteger() 验证。
-
"A".codePointAt(0)→ 65 -
"?".codePointAt(0)→ 128522(即 U+1F60A) -
"?".codePointAt(0)→ 414909(U+654BD,需两个 code unit 表示)
遍历字符串并获取所有码点(避免代理对拆分)
用 for...of 循环可自动按字符(而非代码单元)迭代,内部基于码点逻辑,比传统 for (let i=0; i<str.length i> 更安全:</str.length>
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
for (const ch of "a??") { console.log(ch.codePointAt(0).toString(16)); }- 输出:
61、1f60a、654bd(十六进制 Unicode 码点)
转成十六进制或 Unicode 转义形式
可用 .codePointAt() + .toString(16) 获取小写十六进制;用 String.fromCodePoint() 反向还原;也可用 JSON.stringify() 查看转义序列:
立即学习“Java免费学习笔记(深入)”;
-
"?".codePointAt(0).toString(16)→ "1f60a" -
String.fromCodePoint(0x1f60a)→ "?" -
JSON.stringify("?")→ ""\ud83d\ude0a""(UTF-16 代理对转义)

















