25 分钟
工程化

编码与乱码:工作中最常见的坑

Unicode/UTF-8/GBK 原理、文件读写乱码、控制台乱码全解

  • 理解 Unicode、UTF-8、GBK 的关系
  • 掌握 Python 文件读写的 encoding 参数
  • 解决 Windows 控制台乱码
  • 掌握编码问题的排查方法

编码与乱码:工作中最常见的坑

工作中遇到的第一个真实问题,大概率不是算法,而是乱码。日志里的中文变成乱码、读取 CSV 文件报错、Windows 上跑正常的代码在 Linux 上挂了——这些都是编码问题。

Unicode 与 UTF-8 的关系

示例代码(可运行)
🚫乱码的根源

乱码只有一个原因:用错误的编码方式解码。用 UTF-8 编码的字节,用 GBK 去解码,就会得到乱码。解决方法:明确知道字节的编码,用对应编码解码。

文件读写的编码陷阱

示例代码(可运行)
⚠️Windows 控制台乱码

Windows 的 cmd/PowerShell 默认编码可能是 GBK(代码页 936),导致 print 中文报错 UnicodeEncodeError。解决方案:代码中设置 sys.stdout.reconfigure(encoding='utf-8');设置环境变量 PYTHONIOENCODING=utf-8;Windows Terminal 默认 UTF-8,推荐使用;chcp 65001 切换代码页。

网络请求中的编码

Python
# 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 记事本等软件添加:

示例代码(可运行)
找 Bug不指定 encoding 时,Windows 默认用 GBK 写入,Linux 默认用 UTF-8 读取,编码不匹配导致乱码。
# Windows 上写的文件,Linux 上读出来乱码 with open("log.txt", "w") as f: f.write("启动成功") # 在 Linux 上: with open("log.txt", "r") as f: print(f.read()) # 乱码!
选择题

Python 中 str 和 bytes 互转用什么方法?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

常见根因:内存泄漏导致 OOM 被系统杀掉、连接/文件句柄没关闭耗尽、事件循环里混入同步阻塞、未捕获异常让进程退出。12-Factor App 的建议很实用:配置环境化、日志当成事件流输出、进程保持无状态(状态放数据库/缓存),这样才能随时加副本做水平扩展。

挑战任务

安全的文件读取

简单+50 XP

写一个函数 safe_read(path),依次尝试 UTF-8、GBK 读取文件,返回内容。

安全的文件读取
2 个测试用例

课后作业

批量转换文件编码

中等+25 XP

写个脚本,把目录下所有 .txt 文件从 GBK 转成 UTF-8。

批量转换文件编码
1 个测试用例