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