十六进制 / ASCII / Unicode
编码在文本、UTF-8 十六进制字节与 Unicode 码点之间互转。
- 文本
- 十六进制 (UTF-8)
- 码点
本页内容
什么是十六进制 / ASCII / Unicode 转换器?#
同一段文本可以有三种本质上不同的写法,本工具让你同时看到这三种视图:
- Text(文本)——你平时敲进去、读出来的字面字符(
Hello 世界 🌍)。 - Hex bytes(十六进制字节)——真正的 UTF-8 字节序列,每字节用两位十六进制表示(
48 65 6C 6C 6F 20 ...)。这才是数据在网上传输、在文件里落地的真实形态。 - Code points(码点)——Unicode 标量值,每个字符一个
U+XXXX(U+0048 U+0065 ... U+1F30D)。这是 Unicode 给字符编的号,独立于任何字节编码。
这三种视图之所以重要,是因为一旦离开 ASCII,它们的长度就不再相等——而这正是文本编码领域绝大多数困惑的根源。一个字符是一个码点,但它在 UTF-8 里可能占 1 到 4 个字节。地球 emoji 🌍 是一个字符(U+1F30D),但在 UTF-8 里是四个字节(F0 9F 8C 8D)。如果你曾经把字符串长度数错、被数据库以”太长”为由拒收、或者见过一个切片正好切在字符中间——你已经和这道鸿沟打过照面了。
编辑三种视图里的任意一种,另外两种会即时派生出来。解析很宽容:十六进制输入接受空格、冒号、短横、0x 前缀;码点输入接受 U+、\u、0x 或裸十六进制,之间用空格、逗号、分号分隔都行。
怎么使用#
- 用输入框上方的 模式选择器 声明你正在输入的是哪种:Text、Hex 或 Code points。
- 在输入框里粘贴或编辑,右侧自动填出另外两种视图。
- 点任意一个结果字段旁的 复制(Copy)取走那种表示。
- 示例(Sample)载入
Hello 世界 🌍,让你看清 ASCII、CJK、emoji 各自怎么映射。清空(Clear)清掉一切。
主要特性#
- 三种视图,唯一真相源。 你手头有哪种表示就编辑哪种,其余两种都是算出来的,不必手工维护。
- 是 UTF-8 字节,不是 Latin-1。 十六进制输出是真正的在线传输 UTF-8 字节序列——几乎所有现代系统都用它,而不是”一个字符一个字节”那种老式假设。
- 按码点感知,含增补平面字符。 用
for...of迭代,意味着一个 emoji 被算作一个码点,而不是两个代理项一半,所以你看到的是U+1F30D,绝不会是D83C DF0D。 - 反向校验严格。 十六进制字节若不构成合法 UTF-8(奇数长度、或者一个悬空的续字节),会报清晰错误,而不是解码成一堆乱码。超出合法范围的码点、以及孤立的代理项(
U+D800–U+DFFF)都会被拒。
实例演示#
点 示例 载入 Hello 世界 🌍,三种派生视图是:
Text: Hello 世界 🌍
Hex bytes: 48 65 6C 6C 6F 20 E4 B8 96 E7 95 8C 20 F0 9F 8C 8D
Code points: U+0048 U+0065 U+006C U+006C U+006F U+0020 U+4E16 U+754C U+0020 U+1F30D
ASCII 字母 H e l l o 是无趣的部分:各占一字节,码点从 U+0048 到 U+006F。有意思的是后面:
世(U+4E16)是 3 个 UTF-8 字节:E4 B8 96。界(U+754C)也是 3 个字节:E7 95 8C。一个字符,但不是一个字节。🌍(U+1F30D)是 4 个 UTF-8 字节:F0 9F 8C 8D。它的码点超过U+FFFF,住在 Unicode 的增补平面,需要 4 字节的 UTF-8 序列——但它仍然只是一个字符、码点列表里的一项。
反过来做个实验:把模式切到 Code points,粘贴 U+1F600 U+1F604,文本(😄😄)和 UTF-8 十六进制会同时出现。这种往返正是你确认”哪个字节对应哪个字符”的方法。
常见问题#
为什么我的 emoji 是 4 个十六进制字节,却只对应 1 个码点?#
因为 UTF-8 是变长编码。码点低于 U+0080 装一个字节;U+0080–U+07FF 占两个;U+0800–U+FFFF 占三个;U+10000 及以上(绝大多数 emoji、古文字、音乐符号)占四个。码点是 Unicode 给这个字符起的名;字节是 UTF-8 恰好用来存它的方式。同一个字符,两个不同的数字。
U+XXXX 和 \uXXXX 有什么区别?#
它们指的是同一个码点,但来自不同的世界。U+0041 是 Unicode 自己的记法;A 是 JavaScript、Java、C 字符串字面量里的转义。但有个坑:\uXXXX 只能装 4 位十六进制,所以它没法直接表达 U+1F30D 这种增补码点——用 \u 的语言要么写成代理对(🌍),要么用扩展语法(\u{1F30D})。本工具的码点输入这两种形式都收。
我粘贴十六进制字节,报”invalid UTF-8”是什么意思?#
你粘的字节不构成合法 UTF-8 序列——最常见的原因是十六进制串长度为奇数(少了一半字节)、一个前导字节声称是多字节序列而后续字节对不上,或者数据其实是用 UTF-8 以外的东西(GBK、Shift-JIS、裸 Latin-1)编码的。解码器用严格模式,所以会报错,而不是悄悄吐出替换字符。
能用它数一段字符串”真正”的字符数吗?#
能——码点数就是用户心目中的字符数,也是绝大多数 UI 该拿来设上限的数。注意 Hello 世界 🌍 按码点是 10 个字符,即便它在 UTF-8 里是 17 字节、在 JavaScript 里是 11 个 UTF-16 码元(string.length)。如果你要给一条推文或一个表单字段设字符预算,数码点,别数字节,也别用 string.length。