编码与乱码:工作中最常见的坑
Unicode/UTF-8/GBK 原理、文件读写乱码、控制台乱码全解
- 理解 Unicode、UTF-8、GBK 的关系
- 掌握 Python 文件读写的 encoding 参数
- 解决 Windows 控制台乱码
- 掌握编码问题的排查方法
编码与乱码:工作中最常见的坑
工作中遇到的第一个真实问题,大概率不是算法,而是乱码。日志里的中文变成乱码、读取 CSV 文件报错、Windows 上跑正常的代码在 Linux 上挂了——这些都是编码问题。
Unicode 与 UTF-8 的关系
乱码只有一个原因:用错误的编码方式解码。用 UTF-8 编码的字节,用 GBK 去解码,就会得到乱码。解决方法:明确知道字节的编码,用对应编码解码。
文件读写的编码陷阱
Windows 的 cmd/PowerShell 默认编码可能是 GBK(代码页 936),导致 print 中文报错 UnicodeEncodeError。解决方案:代码中设置 sys.stdout.reconfigure(encoding='utf-8');设置环境变量 PYTHONIOENCODING=utf-8;Windows Terminal 默认 UTF-8,推荐使用;chcp 65001 切换代码页。
网络请求中的编码
# requests 库的编码问题
import requests
resp = requests.get("https://example.com")
# resp.text 会根据响应头猜测编码,可能猜错
# resp.content 是原始 bytes
# 正确做法:明确指定或让 requests 用 apparent_encoding
resp.encoding = resp.apparent_encoding # chardet 检测
html = resp.text
# 或者手动指定
# resp.encoding = "utf-8"
# JSON 响应一般不会有编码问题(requests 自动处理)
data = resp.json()
print("网络请求编码处理")BOM 与其他编码坑
BOM(Byte Order Mark)是 UTF-8 文件开头可能出现的 3 个字节 \xef\xbb\xbf,由 Windows 记事本等软件添加:
Python 中 str 和 bytes 互转用什么方法?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
常见根因:内存泄漏导致 OOM 被系统杀掉、连接/文件句柄没关闭耗尽、事件循环里混入同步阻塞、未捕获异常让进程退出。12-Factor App 的建议很实用:配置环境化、日志当成事件流输出、进程保持无状态(状态放数据库/缓存),这样才能随时加副本做水平扩展。
挑战任务
安全的文件读取
写一个函数 safe_read(path),依次尝试 UTF-8、GBK 读取文件,返回内容。
课后作业
批量转换文件编码
写个脚本,把目录下所有 .txt 文件从 GBK 转成 UTF-8。