1. Unicode 与 UTF-8 的区别 #
- Unicode 只规定「这个字符编号是多少」,不规定在磁盘上占几个字节。
- UTF-8 是最常用的编码方式,也是项目里的默认选择。
| 概念 |
作用 |
类比 |
| Unicode |
为每个字符分配全球唯一的码点(如 U+4E2D) |
字符的「身份证号」 |
| UTF-8 |
把码点编成 1~4 字节的字节序列,用于存储和传输 |
身份证号的「存储格式」 |
2. 字符的完整路径 #
- 字符在计算机中的完整路径:字符 → Unicode 码点 → UTF-8 字节。
字符 → Unicode 码点 → UTF-8 字节
char = "中"
print(ord(char))
print(f"U+{ord(char):04X}")
print(char.encode("utf-8"))
print(char.encode("utf-8").hex())
3. 常见字符占用的字节数 #
| 字符示例 |
码点 |
UTF-8 字节数 |
A |
U+0041 |
1 |
中 |
U+4E2D |
3 |
😀 |
U+1F600 |
4 |
- 英文和数字在 UTF-8 中与 ASCII 相同,只占 1 字节;中文通常 3 字节;Emoji 通常 4 字节。
4. Python 中的常用操作 #
- 日常开发用内置方法即可,不需要手写 UTF-8 编解码算法。
print(ord("A"))
print(chr(0x4E2D))
b = "你好".encode("utf-8")
print(b.decode("utf-8"))
- 调试时若看到
b'\xe4\xb8\xad' 或日志里的 \xe4\xb8\xad,表示 UTF-8 编码后的字节,用 .decode("utf-8") 即可还原为可读文本。
5. 项目开发要点 #
- 分清两层概念:业务里操作
str(Unicode 文本);落盘、发网络时用 encode("utf-8") 得到 bytes。
- 不要自己实现 UTF-8:位运算、首字节规则等属于底层原理,读日志、写接口用
encode / decode 足够。
- 与编码章节配合:文件读写、HTTP、数据库连接统一指定 UTF-8,避免乱码。
- 估算存储/传输大小:纯英文按 1 字节/字符粗算,中文按约 3 字节/字符粗算(精确值以
len(s.encode("utf-8")) 为准)。