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() 验证。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
"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>
for (const ch of "a??") { console.log(ch.codePointAt(0).toString(16)); }- 输出:
61、1f60a、654bd(十六进制 Unicode 码点)
转成十六进制或 Unicode 转义形式
可用 .codePointAt() + .toString(16) 获取小写十六进制;用 String.fromCodePoint() 反向还原;也可用 JSON.stringify() 查看转义序列:
-
"?".codePointAt(0).toString(16)→ "1f60a" -
String.fromCodePoint(0x1f60a)→ "?" -
JSON.stringify("?")→ ""\ud83d\ude0a""(UTF-16 代理对转义)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










