piapia123
zh

Unicode 转义与还原

编码加密

所有处理都在浏览器本地完成,数据不上传服务器

输入
输出

把中文、emoji 这类非 ASCII 字符转成转义写法,或者把转义还原成字符。三种写法各有各的场合:\uXXXX 用在 JS / Java / C# 的字符串字面量与 .properties 文件里;\xXX 表示 UTF-8 字节,是 Python、C、PHP 里常见的写法(\xE4\xB8\xAD 就是「中」);&#xXXXX; 是 HTML 的数字实体。emoji 按标准的成对代理项写成 \uD83D\uDE00,而不是 Java 与 .properties 文件不认的 \u{1F600}。为了让编解码严格互逆,反斜杠与 & 也会一并转义 —— 否则原文里本来就有的 \u0041 会在解码时被当成转义序列,静默变成字母 A。

功能

  • 双向转换:中文、emoji 与非 ASCII 字符 ⇄ 转义写法
  • 三种形式:\uXXXX(JS / Java)、\xXX(UTF-8 字节)、&#xXXXX;(HTML 数字实体)
  • 解码时三种形式同时识别,混在一段文本里也能还原
  • emoji 输出标准的成对代理项 \uD83D\uDE00,Java 与 .properties 文件可直接使用
  • 编码时把反斜杠与 & 一并转义,保证「解码(编码(x)) === x」严格成立
  • 解码还认得 \u{1F600} 与 \U0001F600 两种码点写法
  • 认不出的转义原样保留,不报错也不吞掉

使用方法

  1. 选择方向:编码或解码
  2. 编码时选择想要的转义形式
  3. 把内容粘贴进输入框,结果实时出现
  4. 点「复制」取走结果

常见问题

\xXX 形式下中文为什么变成三个字节?
因为 \xXX 表示的是一个字节,而中文超出了单字节能表示的范围,必须先按 UTF-8 编码:中 = E4 B8 AD,写成 \xE4\xB8\xAD。这正是 Python 的 bytes、C 的字符串字面量里的表示方式。解码时也按这个规则处理,所以能不能还原,取决于那串字节本身是不是合法的 UTF-8。
为什么输出里多出了 \u0026 和 \u005C?
为了让编解码严格互逆。原文里可能本来就写着 \u0041 或 中,如果不把反斜杠与 & 转义,解码时会把它们当成真正的转义序列,静默给出错误结果。转义后的输出在 JS、Java、.properties 里都会被正确还原成原来的字符。
emoji 为什么是两个 \u 而不是一个?
U+1F600 超出了基本多文种平面(BMP),在 UTF-16 里必须写成代理对 \uD83D\uDE00。Java 与 .properties 文件只认这种写法,不认 \u{1F600},所以编码时按成对形式输出;反过来,解码时相邻的成对转义会自动拼成一个完整字符。
解码时遇到坏转义会报错吗?
不会。三种形式同时识别,认不出来的(半截的 \uD8、越界的 �、\n 这种别的语言的转义)一律原样保留。一段真实文本里混着几条无关的转义是常态,为此整段报错反而让你连正常的部分都拿不到。

相关工具