记事本默认用gbk解码无bom的utf-8文件导致乱码,因它依赖系统ansi代码页且不自动识别utf-8;python写入应改用encoding='utf-8-sig'添加bom以兼容,读取仍可用'utf-8'。

Windows 记事本默认用 GBK 打开无 BOM 的 UTF-8 文件,不是 Python 写错了,是记事本“猜编码”失败了。
为什么记事本打开 UTF-8 文件显示乱码
记事本(notepad.exe)在没有 BOM 标记时,会按系统 ANSI 代码页(简体中文 Windows 是 GBK)尝试解码。Python 用 encoding='utf-8' 写出的纯 UTF-8 文件不含 BOM,记事本就误判为 GBK,把两个字节当一个汉字解,结果全成乱码。
- 现象:Python 写入正常,
open('a.txt', 'r', encoding='utf-8').read()能正确读回;但双击用记事本打开就是 - 验证方法:用 VS Code、Notepad++ 或
type a.txt(PowerShell)打开,通常能自动识别 UTF-8 - 不是 bug,是记事本几十年的老行为,微软没改,也不打算改
写入时加 BOM 就能兼容记事本
只需把 encoding='utf-8' 换成 encoding='utf-8-sig',Python 会在文件开头自动写入 UTF-8 BOM(\xef\xbb\xbf),记事本看到这个标记就会乖乖用 UTF-8 解码。
- 正确写法:
with open('out.txt', 'w', encoding='utf-8-sig') as f: f.write('你好') -
utf-8-sig仅影响写入:开头加 BOM,内容仍是标准 UTF-8,不影响其他程序读取 - 读取时仍可用
encoding='utf-8'(BOM 会被自动跳过),无需改成utf-8-sig - 注意:Excel 也依赖 BOM 识别 UTF-8 CSV,所以导出表格时优先用
utf-8-sig
别依赖记事本判断文件编码是否正确
记事本只是个特例,不能代表文件真实编码。真正验证方式是让 Python 自己读回来:
- 写完立刻用相同 encoding 读:
open('x.txt', 'r', encoding='utf-8').read()不报错且内容对,说明写入成功 - 用
file命令(Linux/macOS)或 PowerShellGet-Content -Encoding UTF8验证 - 避免用
chardet检测刚写完的文件——它对短文本或无特殊字符的文件容易误判 - 如果必须用记事本测试,只认
utf-8-sig输出,其他编码方案(如gbk)虽能显示,但丧失跨平台性
真正麻烦的不是加不加 -sig,而是团队里有人用记事本改了 utf-8-sig 文件又保存,BOM 被删掉,下一次 Python 读就报 UnicodeDecodeError ——这种静默破坏比乱码更难排查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











