python 2 中 str 是字节序列、unicode 才是字符串,python 3 中 str 是 unicode、bytes 才是字节;混用导致多数 unicode 错误,读写文件必须显式指定 encoding,http 响应应优先用 content + 显式 decode,正则需加 re.u 处理中文。

Python 2 和 Python 3 对 str 的理解完全不同
Python 2 把 str 当字节序列,unicode 才是真正的字符串;Python 3 反过来:str 是 Unicode 字符串,bytes 才是字节。混用这两者是绝大多数 Unicode 错误的根源。
- 读文件不加
encoding参数?默认用系统 locale 解码,Windows 上常是cp1252,Linux/macOS 上可能是utf-8或ascii—— 同一份代码在不同机器上可能突然报UnicodeDecodeError -
open('file.txt').read()在 Python 3 中返回str,但底层读的是字节,它会悄悄用locale.getpreferredencoding()去 decode —— 这个值不可靠 - 用
str.encode()而不指定编码?默认用utf-8,但如果你后续要写入数据库或发 HTTP 请求,而对方期望latin-1或gbk,就会出错
读写文件必须显式声明 encoding
除非你明确知道自己在处理二进制数据,否则所有文本 I/O 都该带 encoding='utf-8'(或其它确定编码)。
- 写文件时漏掉
encoding:Python 3 会用 locale 编码写入,中文可能变成乱码,且无法被其他 UTF-8 工具正确读取 - 读 CSV 文件用
pandas.read_csv()却没传encoding?常见报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 123—— 实际文件是gbk编码 - 用
with open(path, 'w') as f:写中文却没指定 encoding,Python 3 可能用utf-8写成功,但 Windows 记事本默认用ansi打开,显示为乱码 —— 这不是 Python 错,是你没控制输出编码
示例:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
with open('data.txt', 'r', encoding='utf-8') as f:
text = f.read() # 安全
<p>with open('out.csv', 'w', encoding='gbk') as f:
f.write('姓名,年龄\n张三,25') # 明确适配目标环境HTTP 响应体解码不能只信 response.text
Requests 库的 response.text 会尝试从 HTTP headers 或响应内容中猜编码,但这个猜测经常不准,尤其服务端没设 Content-Type: text/html; charset=utf-8 时。
立即学习“Python免费学习笔记(深入)”;
- 网页源码里有
<meta charset="gb2312">锛









