Unicode 码点、UTF-16 与转义表示
Unicode 为每个抽象字符分配码点,通常写成 U+ 加十六进制,例如 A 是 U+0041,😀 是 U+1F600。码点不同于 UTF-8 字节,也不总等于 JavaScript 的一个字符串索引。
JavaScript 字符串使用 UTF-16。基本多文种平面内通常是一个 16 位码元,可写为 \u4F60;U+FFFF 以上需要代理对,所以 U+1F600 在四位形式中是 \uD83D\uDE00。现代 \u{1F600} 可直接写标量。
本工具把表示与执行完全分开,只识别 U+ 令牌、\uXXXX 和 \u{…}。它不会调用 eval、Function、脚本元素或把输入当可执行代码。
如何转义与反转义 Unicode
- 要检查普通文本时选择编码。
- 按用途选择 U+ 文档形式、\u{…} 标量形式或展示 UTF-16 码元的 \uXXXX。
- 已有表示法时选择解码,输入 U+ 列表或受支持的转义序列。
- 遇到代理项或范围错误时修正源数据,工具不会自动替换。
- 得到文本后仍需按 HTML、URL、JSON 等目标上下文继续正确转义。
Unicode 码点与转义示例
同一字符可以表示为标量码点、花括号转义,或一个/两个 UTF-16 四位转义。示例在不执行代码的情况下展示差异。
| 输入 | 输出 | 转换方向 | 说明 |
|---|---|---|---|
A |
U+0041 |
编码 | ASCII 码点. 基本拉丁字符只有一个码点和一个 UTF-16 码元。 |
😀 |
U+1F600 |
编码 | Emoji 码点. 该 emoji 是基本多文种平面之外的一个 Unicode 标量。 |
😀 |
\u{1F600} |
编码 | 花括号转义. ECMAScript 花括号语法可直接写完整标量值。 |
😀 |
\uD83D\uDE00 |
编码 | UTF-16 代理对. 四位语法用高代理项和低代理项表示同一个 emoji。 |
U+4F60 U+597D |
你好 |
解码 | 解码中文码点. 码点令牌可用空格或逗号分隔。 |
\u0041\u{1F600} |
A😀 |
解码 | 混合转义形式. 严格解析器可组合受支持形式,但拒绝其他源代码。 |
受支持语法与 Unicode 标量规则
码点输入必须完全由 U+ 和 1-6 位十六进制组成,以空白或逗号分隔。数值范围是 U+0000 到 U+10FFFF,不能落入 U+D800-U+DFFF 代理区。
转义输入可包含四位 \uXXXX 码元和 1-6 位 \u{…} 标量。高代理项必须紧接低代理项,低代理项不能单独出现。
- 十六进制输入不区分大小写,输出使用大写便于阅读。
- 花括号形式直接表示标量并拒绝代理区。
- 四位形式表示 UTF-16 码元,补充字符需要两个转义。
- 普通文本中的未配对代理项会被拒绝。
- 引号、拼接、函数调用等源代码不属于语法。
代理对如何计算与校验
输出码点时按 Unicode 字符迭代,合法高低代理项会组合为一个标量,再格式化为 U+ 或花括号形式。
输出 \uXXXX 时按 UTF-16 码元迭代。补充标量减去 0x10000 后,高 10 位加到 0xD800,低 10 位加到 0xDC00。
解码时,U+ 和花括号值先做标量范围校验;四位码元按顺序扫描,高代理项必须配对。解析器不识别 \x、八进制、模板表达式或 JavaScript 语句。
Unicode 表示法适用场景
当文本外观含糊时,码点能揭示实际序列。它是诊断和文档工具,不是通用安全转义。
| 项目 | 说明 |
|---|---|
| 调试 emoji 与补充字符 | 检查系统是否正确保存一个标量,还是拆分、截断或错序代理对。 |
| 检查不可见字符 | 发现不换行空格、零宽字符、控制符和看似普通的分隔符。 |
| 编写技术文档 | U+ 表示与字体、源编码和具体编程语言无关。 |
| 审查 API 转义数据 | 在不执行代码的前提下查看复制的 Unicode 转义。 |
| 比较规范化结果 | 可区分预组字符与基础字母加组合标记。 |
Unicode 错误与安全边界
未配对代理项是格式错误的 UTF-16,不同编码器可能替换、拒绝或保留。工具选择拒绝,避免悄悄产生 U+FFFD。
反转义不会让结果自动安全。解码后的 <、%、引号仍可能影响 HTML、URL、JSON 或 SQL,必须按目标上下文编码。
- U+110000 超过 Unicode 上限。
- U+D800 不是标量值。
- 单独的 \uD83D 会被拒绝。
- \u{XYZ} 含非法十六进制。
- alert(1) 不会被当作转义,更不会执行。
Unicode 转义与 JSON、HTML、URL 编码
Unicode 转义描述字符或 UTF-16 码元;JSON 还定义引号、反斜杠和完整文档语法。HTML 实体与 URL 百分号编码解决的是各自上下文中的语法问题。
😀 可以是码点 1F600、UTF-16 码元 D83D DE00,或 UTF-8 字节 F0 9F 98 80。不同层次都可能正确。
| 项目 | 说明 |
|---|---|
| JSON 转义 | 需要完整 JSON 解析器;本工具只解析明确 Unicode 表示。 |
| HTML 实体 | 在 HTML 文本中使用 &、😀 等形式。 |
| UTF-8 字节 | 用于存储和传输,一个码点可能占 1-4 个字节。 |