字符串和编码
1. 字符与编码的关系
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。
- 字符集:人类看到的文字(如
中、A、🙂),本质是一个抽象的“符号集合”。 - 编码:把字符映射为二进制数的规则。
- ASCII:早期标准,只支持英文和少数字符。
- Unicode:统一全球字符集,每个字符有唯一码点(如
中是U+4E2D)。 - UTF-8:把 Unicode 码点按 1~4 字节编码的具体实现(可变长编码)。
记忆口诀:字符集管“有哪些字”,编码管“这些字怎么变成 0 和 1”。
2. Python 中的 str 与 bytes
str- 在 Python 中:
str表示 Unicode 字符串。 - 代码里写的字符串字面量(
"hello"、"中文")默认就是str。
- 在 Python 中:
bytesbytes是 字节序列,是已经按照某种编码转换后的结果。- 常用于:网络传输、文件读写、二进制协议。
常见字面量:
b'ABC':bytes,只允许 ASCII 字符。'ABC'、'中文':str,可以是任意 Unicode 字符。
3. ord()、chr() 与 len()
ord(c):字符 → 编码值(码点整数)
ord('A') # 65
ord('中') # 20013
chr(n):编码值 → 字符
chr(65) # 'A'
chr(20013) # '中'
记忆:ord 像“order 编号”,chr 是 “character 字符”。
len():注意str和bytes的区别- 对
str:返回 字符个数 - 对
bytes:返回 字节数
- 对
len('中') # 1(一个字符)
len('中'.encode('utf-8')) # 3(UTF-8 下 3 个字节)
4. encode() 与 decode()
核心记忆:str.encode(编码) -> bytes,bytes.decode(编码) -> str
- 编码
'中'.encode('utf-8') # str -> bytes
- 解码
b'\xe4\xb8\xad'.decode('utf-8') # bytes -> str
注意:
- 编码和解码时使用的编码 必须一致,否则会报错或出现乱码。
5. 字符串格式化与编码
常见三种格式化方式(记住方向:值 → 字符串):
- 百分号格式化
'Hello, %s, you have %d messages.' % ('Bob', 5)
str.format
'Hello, {}, you have {} messages.'.format('Bob', 5)
- f-string(推荐)
name = 'Bob'
count = 5
f'Hello, {name}, you have {count} messages.'
要点:
- 格式化是在
str层面 做替换,与底层编码分离。 - 真正写入文件、网络传输时,再统一用 UTF-8 编码成
bytes。
6. 常见错误与避免方法
-
UnicodeEncodeError/UnicodeDecodeError- 原因:使用了 错误的编码名称 或 默认编码与实际不符。
- 避免:
- 读写文件时显式指定
encoding='utf-8'。 - 网络或协议中约定统一使用 UTF-8。
- 读写文件时显式指定
-
乱码问题本质
- 用 错误的编码方式解码 或者 错误地假设原数据的编码。
7. 文件读写与编码
推荐统一使用 UTF-8:
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('中文内容')
with open('data.txt', 'r', encoding='utf-8') as f:
text = f.read()
记忆要点:
- 始终显式写出
encoding='utf-8'。 - IO 层负责和
bytes打交道,程序中尽量只操作str。
8. 快速记忆总结
- 一对核心类型:
str(Unicode 字符串)、bytes(字节序列)。 - 三类常用函数:
ord()/chr():字符 ↔ 码点len():str计字符,bytes计字节
- 两种关键操作:
encode():str→bytesdecode():bytes→str
- 一个推荐标准:统一使用 UTF-8。
- 一个根本原则:编码、解码必须使用 同一种编码方式。