博客
简体中文

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-8UTF-16十进制可见字符
CU+0043430043671
aU+0061610061972
fU+00666600661023
éU+00E9C3 A900E92334
(不可见)U+0020200020325
😀U+1F600F0 9F 98 80D83D DE001285126
(不可见)U+0020200020327
中U+4E2DE4 B8 AD4E2D200138

工具简介

输入一段文字,所有常用的表示方式会一次性列出,每一种都带复制按钮:Unicode 码位、JavaScript 和 JSON 转义、ES6 写法、HTML 十六进制和十进制字符实体,以及原始的 UTF-8 和 UTF-16BE 字节。可以用它把中文等非 ASCII 文字安全地写进源代码,看懂日志里的 \uXXXX 序列,或者查明文字为什么变成了乱码。

工具还会比较 UTF-8、UTF-16 和韩文传统编码 EUC-KR(CP949)的字节数,并在表格中逐个列出码位。反方向可以把转义序列或十六进制字节还原成文字。所有处理都在浏览器中完成,不保存任何内容。

使用方法

  1. 选择方向:文字 → 编码,或编码 → 文字。
  2. 选择“文字 → 编码”时,在文本框中输入。框里已有示例“Café 😀 中”,可以马上看到结果。
  3. 取消勾选“ASCII 保持原样”,就会转义所有字符,而不只是非 ASCII 字符。
  4. 复制你需要的格式。下方是字节数比较和字符表。
  5. 选择“编码 → 文字”时,转义序列和 U+ 值(即使混在一起)用“自动识别”即可;字节列表请选择对应的十六进制字节格式。
  6. 用按钮复制解码后的文字。

工作原理

  • 码位写成 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é &#x1F600; 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 等中文传统编码的字节数。

我输入的文字会被发送出去吗?

不会。所有转换都在浏览器中进行,你输入的内容不会被保存或上传。

没找到想要的工具?