Unicode 编码转换 — 码位与 UTF-8 字节
文字与 Unicode 码位、转义序列和 UTF-8 字节互相转换
在浏览器中处理 · 不上传任何内容
可见字符 8 个 · 码位 8 个 · UTF-16 长度 9
转换结果
码位(U+XXXX)
U+0043 U+0061 U+0066 U+00E9 U+0020 U+1F600 U+0020 U+4E2D
JavaScript / JSON(\uXXXX)
Caf\u00E9 \uD83D\uDE00 \u4E2D
ES6(\u{...})
Caf\u{E9} \u{1F600} \u{4E2D}
HTML 十六进制(&#x...;)
Café 😀 中
HTML 十进制(&#...;)
Café 😀 中
UTF-8 字节(十六进制)
43 61 66 C3 A9 20 F0 9F 98 80 20 E4 B8 AD
UTF-16BE 字节(十六进制)
00 43 00 61 00 66 00 E9 00 20 D8 3D DE 00 00 20 4E 2D
各编码的字节数
- UTF-8
- 14 字节
- UTF-16
- 18 字节
- EUC-KR(CP949)
- 7 字节
- 有 2 个字符无法用 EUC-KR 表示(未计入)
EUC-KR(CP949)是韩文的传统编码:KS X 1001 中的 2,350 个韩文音节和 CP949(UHC)扩展区中的其余 8,822 个现代音节都占 2 字节。在 UTF-8 中,常用汉字和韩文音节各占 3 字节,一个 emoji 占 4 字节。
字符表
| 字符 | 码位 | UTF-8 | UTF-16 | 十进制 | 可见字符 |
|---|---|---|---|---|---|
| C | U+0043 | 43 | 0043 | 67 | 1 |
| a | U+0061 | 61 | 0061 | 97 | 2 |
| f | U+0066 | 66 | 0066 | 102 | 3 |
| é | U+00E9 | C3 A9 | 00E9 | 233 | 4 |
| (不可见) | U+0020 | 20 | 0020 | 32 | 5 |
| 😀 | U+1F600 | F0 9F 98 80 | D83D DE00 | 128512 | 6 |
| (不可见) | U+0020 | 20 | 0020 | 32 | 7 |
| 中 | U+4E2D | E4 B8 AD | 4E2D | 20013 | 8 |
工具简介
输入一段文字,所有常用的表示方式会一次性列出,每一种都带复制按钮:Unicode 码位、JavaScript 和 JSON 转义、ES6 写法、HTML 十六进制和十进制字符实体,以及原始的 UTF-8 和 UTF-16BE 字节。可以用它把中文等非 ASCII 文字安全地写进源代码,看懂日志里的 \uXXXX 序列,或者查明文字为什么变成了乱码。
工具还会比较 UTF-8、UTF-16 和韩文传统编码 EUC-KR(CP949)的字节数,并在表格中逐个列出码位。反方向可以把转义序列或十六进制字节还原成文字。所有处理都在浏览器中完成,不保存任何内容。
使用方法
- 选择方向:文字 → 编码,或编码 → 文字。
- 选择“文字 → 编码”时,在文本框中输入。框里已有示例“Café 😀 中”,可以马上看到结果。
- 取消勾选“ASCII 保持原样”,就会转义所有字符,而不只是非 ASCII 字符。
- 复制你需要的格式。下方是字节数比较和字符表。
- 选择“编码 → 文字”时,转义序列和 U+ 值(即使混在一起)用“自动识别”即可;字节列表请选择对应的十六进制字节格式。
- 用按钮复制解码后的文字。
工作原理
- 码位写成 U+ 加大写十六进制,至少补足四位(U+0041),用空格分隔。
- JavaScript / JSON 转义按每个 UTF-16 代码单元写一个
\uXXXX,所以 U+10000 以上的字符会变成代理对。ES6 写法按每个码位写一个\u{...}。 - HTML 字符实体按每个码位写一个
&#x…;或&#…;。 - ASCII 保持原样时,可打印 ASCII 字符(U+0020 至 U+007E)不变,但反斜杠(JavaScript)和 & < > “ ’(HTML)除外,这样输出可以无歧义地解码回去。换行和制表符始终会被转义。
- UTF-8 字节由浏览器的 TextEncoder 生成。UTF-16 每个代码单元写两个字节,高位字节在前(大端序)。
- EUC-KR(CP949):用浏览器的 EUC-KR 解码器解码所有双字节组合(首字节 0x81 至 0xFE,尾字节 0x41 至 0xFE),建立反向查找表;ASCII 为一个字节。从 가 到 힣 的全部 11,172 个韩文音节都占两个字节:2,350 个来自 KS X 1001,8,822 个来自 CP949(UHC)扩展区;如果解码器只认识 KS X 1001,扩展区按 CP949 的排列补齐。
- 可见字符是浏览器 Intl.Segmenter 切分出的字素簇(Unicode 标准附录 #29)。字符表每个码位一行,会标出由多个码位组成的字符,最多显示前 200 个。
- 解码:U+ 值接受 4 到 8 位十六进制数字,U+ 值之间的空格或逗号视为分隔符。超过 U+10FFFF 的值和未配对的代理项会连同字符位置一起报告。字节输入会忽略空格、逗号、冒号、连字符以及 0x、\x 或 % 前缀,无效的 UTF-8 会报告字节位置。
- 输入最多 20,000 个字符。
示例
| 文字 | 码位 | JavaScript | UTF-8 字节 | UTF-8 / UTF-16 / EUC-KR |
|---|---|---|---|---|
| A | U+0041 | A(取消“ASCII 保持原样”时为 A) |
41 | 1 / 2 / 1 字节 |
| é | U+00E9 | é |
C3 A9 | 2 / 2 / 无法表示 |
| 中 | U+4E2D | 中 |
E4 B8 AD | 3 / 2 / 2 字节 |
| 한 | U+D55C | 한 |
ED 95 9C | 3 / 2 / 2 字节 |
| 😀 | U+1F600 | 😀 |
F0 9F 98 80 | 4 / 4 / 无法表示 |
默认示例“Café 😀 中”有 8 个可见字符、8 个码位,UTF-16 长度为 9。它在 UTF-8 中占 14 字节,在 UTF-16 中占 18 字节,在 EUC-KR 中占 7 字节(é 和 emoji 无法表示)。
反方向时,自动识别会把 Café 😀 U+4E2D 转换成“Café 😀 中”,UTF-8 字节 E4 B8 AD E6 96 87 解码为“中文”。
常见问题
码位和编码有什么区别?
码位是 Unicode 给每个字符分配的编号,例如“中”是 U+4E2D。编码是这个编号存成字节的方式。同一个“中”在 UTF-8 中是 E4 B8 AD,在 UTF-16 中是 4E 2D。é(U+00E9)在 UTF-8 中是 C3 A9,在 UTF-16 中是 00 E9。
为什么一个 emoji 会变成两个 \uXXXX?
JavaScript 和 JSON 字符串是由 UTF-16 代码单元组成的。U+FFFF 以上的字符需要两个单元,称为代理对,所以 😀(U+1F600)写作 😀。ES6 的 \u{1F600} 写法直接给出码位,只需要一个转义。
为什么一个 emoji 算作好几个码位?
很多 emoji 是序列。家庭 emoji 由三个人物 emoji 和两个零宽连接符(U+200D)组成,看起来是一个字符,实际上是 5 个码位、8 个 UTF-16 单元和 18 个 UTF-8 字节。肤色、旗帜和分解形式的韩文也是如此,所以汇总里同时显示这三种数量。
“无法用 EUC-KR 表示”是什么意思?
EUC-KR(CP949)是韩文的传统编码,包含韩文、汉字(韩国汉字)和一批符号,但不包含 emoji 或 é 这样的字母。这些字符不计入 EUC-KR 的字节总数,而是单独统计。如果浏览器没有 EUC-KR 解码器,这一项会被隐藏。本工具不计算 GBK、GB 18030 等中文传统编码的字节数。
我输入的文字会被发送出去吗?
不会。所有转换都在浏览器中进行,你输入的内容不会被保存或上传。