文本转 Unicode

把文本转换为 Unicode 码点、HTML 实体或 JavaScript 转义序列,并可反向解码。完整支持辅助平面字符与 emoji。

在文本与 Unicode 码点之间双向转换。 可选择 HTML 实体、JavaScript 转义或 U+ 表示法。两侧都可编辑,基本多文种平面之外的字符(包括所有 emoji)会作为单个码点处理,而不会被拆成代理对。

码点、编码与代理对

码点不是字节

Unicode 为每个字符分配一个编号,称为码点,写作 U+ 加十六进制数字。A 是 U+0041, 是 U+8702,蜜蜂 emoji 是 U+1F41D。这个编号是字符的身份标识。至于如何存储——UTF-8、UTF-16 还是 UTF-32——是另一个层面的决定,这也是本工具与「文本转二进制」不同的地方。

代理对陷阱

JavaScript 字符串采用 UTF-16。U+FFFF 以上的码点会被存成两个 16 位的半值,称为代理对。用 charCodeAt 简单循环的代码会把一个 emoji 看成 0xD800-0xDFFF 之间两个无意义的值,并报告 "🐝".length 等于 2。本工具按码点迭代,因此蜜蜂 emoji 只产生一个值 U+1F41D,而不是两个残缺的半值。

四种输出格式

  • HTML 十进制实体 —— A。可用于任何 HTML 文档和 XML。
  • HTML 十六进制实体 —— A。同样的内容用十六进制表示,与 Unicode 官方图表的写法一致。
  • JavaScript 转义 —— \u0041。用于源代码中的字符串字面量。U+FFFF 以上必须使用花括号形式 \u{1F41D},本工具会自动输出该形式。
  • 码点表示法 —— U+0041。规范文档中使用的写法。

实际用途

把非 ASCII 文本转义为实体,可以让它安全通过那些会破坏编码的系统,例如老旧的邮件网关或配置错误的数据库。查看码点也是排查不可见字符最快的方法:零宽空格(U+200B)和不换行空格(U+00A0)在屏幕上与普通空格毫无区别,却会导致字符串比较失败。把可疑文本粘贴进来,差异立刻可见。

开源说明:基于 JavaScript 原生的 String.prototype.codePointAt 与 String.fromCodePoint 实现,未使用第三方库。

常见问题

为什么一个 emoji 只输出一个 U+1F41D 而不是两个值?
本工具按码点迭代,而不是按 UTF-16 码元。Emoji 位于 U+FFFF 以上,简单的字符循环会把它拆成代理对,本工具不会。
这个工具和「文本转二进制」有什么区别?
本工具展示码点,即每个字符的抽象身份;二进制工具展示用于存储它们的 UTF-8 字节。一个字符可能是一个码点,却对应三个字节。
可以混合多种格式一起解码吗?
可以。解码器能在同一段输入中识别 &#..;、&#x..;、\uXXXX、\u{...} 和 U+....,转义之间的普通文本会原样保留。
如何找出字符串里的不可见字符?
粘贴后切换到 U+ 表示法。零宽空格显示为 U+200B,不换行空格为 U+00A0,字节序标记为 U+FEFF——它们在屏幕上不可见,在这里却一目了然。
HTML 实体可以直接放进页面吗?
可以,数字字符引用在 HTML 和 XML 中都是合法的。但要注意它只转义字符本身,不能替代对不可信内容中 <、> 和 & 的正规 HTML 转义。
数据会离开浏览器吗?
不会。转换只是本地的字符串处理。