UTF-8 是变长编码,用 1~4 字节 表示一个 Unicode 码点,兼容 ASCII(0~127)。
核心原则:
单字节字符:最高位为
0,和 ASCII 完全一致多字节字符:第一个字节开头标记总长度,后续每个字节固定以
10开头(续字节)
编码格式模板(二进制)
说明:模板里的
x用来存放 Unicode 码点的二进制位。 Unicode 上限固定 U+10FFFF,UTF-8 最多只用 4 字节,不会有 5/6 字节版本。
编码步骤(举例)
举个例子:汉字 中,Unicode 码点 U+4E2D
转二进制:
4E2D→0100 1110 0010 1101(共 16bit)落在
U+0800 ~ U+FFFF→ 3 字节模板:1110xxxx 10xxxxxx 10xxxxxx把 16 位从右往左依次填入模板的
x:
11100100 10111000 10101101
转十六进制:
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开头,这个设计是为了防止截断乱码: 比如字节流中间断开,不会把续字节误识别成新字符的起始字节。
关键特性
兼容 ASCII:英文、数字、半角符号和 ASCII 编码一模一样,旧英文文本无需转码。
变长省空间:英文 1 字节;大部分汉字 3 字节;生僻字 /emoji 4 字节。对比 UTF-16,英文场景 UTF-8 更省存储。
自同步:只要找到以
0或11开头的字节,就一定是字符起始位置,不怕流截断。无字节序问题:UTF-8 不需要 BOM(
0xEF 0xBB 0xBF),BOM 只是 Windows 的习惯标记,标准 UTF-8 不推荐带 BOM。
常见码点字节分布速记
英文字母数字符号:1 字节
拉丁文、部分扩展符号:2 字节
绝大多数中日韩汉字:3 字节
生僻古汉字、大部分 emoji:4 字节
小练习:编码 😀(笑脸 emoji U+1F600)
U+1F600 → 二进制
0001 1111 0110 0000 0000范围 U+10000~U+10FFFF → 4 字节模板
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx填充 →
11110000 10011111 10011000 10000000十六进制:
0xF0 0x9F 0x98 0x80
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢