UTF8与中文互转
中文与 UTF-8 字节互转:中文一键得到十六进制、百分号(%E4%B8%AD)、\xE4\xB8\xAD、\u4E2D 与十进制字节数组;反向自动识别这几种写法并解码,非法、截断、过长编码的字节按 RFC 3629 给出明确错误码。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
encode:中文 → UTF-8 字节表示;decode:自动识别十六进制、百分号、\xHH、\uXXXX 与十进制字节列表。
转换结果
UTF-8 编解码按 RFC 3629 自行实现,不使用 TextEncoder;「字符数」按码点统计,代理对算 1 个。
输入内容后即可看到转换结果
这个工具能做什么
- 把中文参数、文件名或表单值换成 UTF-8 十六进制,写进代码、配置或排查乱码
- 一次拿到同一条文本的五种写法:E4 B8 AD、%E4%B8%AD、\xE4\xB8\xAD、\u4E2D 与十进制字节 228 184 173
- 反向把日志、抓包、数据库里看到的字节串还原成中文,非法或截断字节时拿到具体原因而不是一串乱码
示例
输入
中文
输出
E4 B8 AD E6 96 87
默认方向「中文 → UTF-8 字节」、表示「十六进制」;一个汉字 3 字节,所以「中文」是 6 字节。
常见问题
\u4E2D 和 UTF-8 字节是一回事吗?
不是。\u4E2D 是码点(JS/JSON 里按 UTF-16 码元书写)的转义写法,一个字符一个转义;UTF-8 字节是文件或网络里真实存的那几个字节。增补平面字符差别更明显:😀(U+1F600)写成 \uD83D\uDE00 是两个代理对,而 UTF-8 是 4 字节 F0 9F 98 80。本工具两种都给,但它们是不同层面的东西。
哪些字节会被判为非法?
按 RFC 3629 分成四类并给出不同错误码:截断(E4 B8)、过长编码(C0 AF)、代理区(ED A0 80)、超出 U+10FFFF(F4 90 80 80),另外还有非法前导或续字节(80、FF、E4 41)。默认直接报错,不静默替换;勾选「非法字节替换为 U+FFFD」后才按每个非法字节一个 U+FFFD 处理。
decode 的自动识别怎么判断?
依次检查 %HH、\xHH、\uXXXX、纯十六进制、十进制字节列表,都不匹配时按「已经是文本」原样返回并给出它的 UTF-8 字节。所以像 ABC 这种只由十六进制字符组成的短串会被当成十六进制(长度为奇数会报错),此时把「输入形式」手动选成「已经是文本」即可。
为什么不用 TextEncoder / TextDecoder?
为了两件事:一是 node 与浏览器结果完全一致(本工具的单元测试就跑在 node 下);二是 TextDecoder 只会把非法字节变成 U+FFFD,区分不出「截断」「过长编码」「代理区」「超出范围」。这里的编解码按 RFC 3629 自己实现,所以能给出准确错误码。
emoji 和非中文字符能处理吗?
能。工具本质是 UTF-8 编解码,任何字符都可以;统计里「字符数」按码点数(😀 算 1 个),「UTF-16 码元」按 JS 字符串长度算(😀 是 2),「字节数」是 UTF-8 字节数(😀 是 4)。
关键词:UTF8转中文中文转UTF8UTF-8 编码百分号编码URL 编码Unicode 转义\u4E2DUTF-8 hexunicode escapeutf8 decode