历史背景
UTF‑8(8‑bit Unicode Transformation Format),1992年由Ken Thompson、Rob Pike设计,是Unicode的可变长编码方案。
- 早期Unicode有UTF‑16,但是不兼容老式ASCII;
- UTF‑8设计目标:完全兼容ASCII,同时可以表示全部Unicode码点,很快成为互联网事实标准。
- 现在网页、JSON、Linux文件、绝大多数网络传输默认都是UTF‑8。
区分: Unicode:字符集(给字符分配码点U+xxxx) UTF‑8:编码方式(把码点转换成字节流)
核心规则
UTF‑8是可变长度编码,一个Unicode码点占用 1‑4 个字节。
| 码点范围 | 字节数 | 二进制格式 | 示例 |
|---|---|---|---|
| U+0000 ~ U+007F | 1字节 | 0xxxxxxx | ASCII字符(A、数字) |
| U+0080 ~ U+07FF | 2字节 | 110xxxxx 10xxxxxx | 拉丁扩展、部分符号 |
| U+0800 ~ U+FFFF | 3字节 | 1110xxxx 10xxxxxx 10xxxxxx | 绝大多数汉字、日文韩文(BMP平面) |
| U+10000 ~ U+10FFFF | 4字节 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | emoji、生僻古汉字(辅助平面) |
编码规则要点
- 首字节标记总字节数:
- 以
0开头 → 1字节(ASCII) - 以
110开头 → 2字节 - 以
1110开头 → 3字节 - 以
11110开头 → 4字节
- 以
- 后续字节(续字节)固定以
10开头,这是UTF‑8的校验标志。 - 最大支持到
U+10FFFF,完整覆盖全部Unicode码点。
例子
- 字符
A,码点U+0041→ UTF‑8:0x41(1字节) - 汉字
中,码点U+4E2D→ UTF‑8:0xE4 0xB8 0xAD(3字节) - 😀笑脸,码点
U+1F600→ UTF‑8:0xF0 0x9F 0x98 0x80(4字节)
优缺点
✅优点
- 向下完全兼容ASCII:ASCII文件直接就是合法UTF‑8,不用转换。
- 网络传输友好,没有大小端问题(不像UTF‑16需要BOM标记)。
- 英文文本体积小;中文文本3字节。
❌缺点
- 汉字占用3字节,比UTF‑16的2字节更大;
- 可变长,不能直接按字节下标取第N个字符,必须解析字节流。
BOM 说明
UTF‑8不推荐使用BOM(字节顺序标记 0xEFBBBF)。
- 部分Windows软件会自动给UTF‑8文件加上BOM;
- 但网页、JSON、Linux环境一般禁止BOM,带BOM会造成解析异常。
对比简要
- UTF‑8:可变长,互联网首选,无大小端;
- UTF‑16:Windows/Java内部,BMP字符2字节;
- UTF‑32:固定4字节,极少用于存储。
一句话总结
UTF‑8就是把Unicode码点,转换成1‑4字节的二进制字节流,兼容ASCII,是现在全世界互联网最通用的编码。