易君召
发布于 2026-09-18 / 作者:易君召 / 2 阅读
0

UTF-8 存储规则详解

UTF-8 是变长编码,用 1~4 字节 表示一个 Unicode 码点,兼容 ASCII(0~127)。

核心原则:

  1. 单字节字符:最高位为 0,和 ASCII 完全一致

  2. 多字节字符:第一个字节开头标记总长度,后续每个字节固定以 10 开头(续字节)

编码格式模板(二进制)

Unicode 码点范围

字节数

编码二进制模板

U+0000 ~ U+007F

1

0xxxxxxx

U+0080 ~ U+07FF

2

110xxxxx 10xxxxxx

U+0800 ~ U+FFFF

3

1110xxxx 10xxxxxx 10xxxxxx

U+10000 ~ U+10FFFF

4

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

说明:模板里的 x 用来存放 Unicode 码点的二进制位。 Unicode 上限固定 U+10FFFF,UTF-8 最多只用 4 字节,不会有 5/6 字节版本。

编码步骤(举例)

举个例子:汉字 ,Unicode 码点 U+4E2D

  1. 转二进制:4E2D0100 1110 0010 1101(共 16bit)

  2. 落在 U+0800 ~ U+FFFF3 字节模板1110xxxx 10xxxxxx 10xxxxxx

  3. 把 16 位从右往左依次填入模板的x

11100100 10111000 10101101
  1. 转十六进制:0xE4 0xB8 0xAD ✅ UTF-8 下 “中” 就是 0xE4B8AD,共 3 字节。

再举 ASCII 例子:A,U+0041 二进制 01000001,属于 1 字节模板:0xxxxxxx,结果就是 0x41

解码规则(反向读取)

读取字节流时,通过第一个字节高位判断

  • 如果字节最高位是 0 → 单个字符,直接读这 1 字节

  • 如果开头是 110 → 当前字符占 2 字节,后面紧跟1 个10开头的续字节

  • 如果开头是 1110 → 当前字符占 3 字节,后面紧跟2 个10续字节

  • 如果开头是 11110 → 当前字符占 4 字节,后面紧跟3 个10续字节

续字节必须以10开头,这个设计是为了防止截断乱码: 比如字节流中间断开,不会把续字节误识别成新字符的起始字节。

关键特性

  1. 兼容 ASCII:英文、数字、半角符号和 ASCII 编码一模一样,旧英文文本无需转码。

  2. 变长省空间:英文 1 字节;大部分汉字 3 字节;生僻字 /emoji 4 字节。对比 UTF-16,英文场景 UTF-8 更省存储。

  3. 自同步:只要找到以011开头的字节,就一定是字符起始位置,不怕流截断。

  4. 无字节序问题:UTF-8 不需要 BOM(0xEF 0xBB 0xBF),BOM 只是 Windows 的习惯标记,标准 UTF-8 不推荐带 BOM。

常见码点字节分布速记

  • 英文字母数字符号:1 字节

  • 拉丁文、部分扩展符号:2 字节

  • 绝大多数中日韩汉字:3 字节

  • 生僻古汉字、大部分 emoji:4 字节

小练习:编码 😀(笑脸 emoji U+1F600)

  1. U+1F600 → 二进制 0001 1111 0110 0000 0000

  2. 范围 U+10000~U+10FFFF → 4 字节模板 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  3. 填充 → 11110000 10011111 10011000 10000000

  4. 十六进制:0xF0 0x9F 0x98 0x80


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/utf-8-storage-rules-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/