2.7 KiB
2.7 KiB
乱码问题修复记录
修复日期:2026-05-17
现象
D:\aaa\aiagent\学习\ 目录下部分 .md 文件在 Windows 记事本等编辑器中打开时,中文显示为乱码。
原因
这些文件是 UTF-8 编码,但缺少 BOM(Byte Order Mark,字节序标记)。
UTF-8 文件有无 BOM 的区别:
| 类型 | 文件头 | Windows 记事本识别 |
|---|---|---|
| UTF-8 with BOM | EF BB BF 开头 |
正确识别为 UTF-8 |
| UTF-8 without BOM | 直接是文本内容 | 误判为 ANSI(中文 Windows 为 GBK),中文变乱码 |
在中文 Windows 系统中,记事本默认用 ANSI(GBK)编码打开无 BOM 的文件,导致 UTF-8 编码的中文被当作 GBK 解码,显示为乱码。VS Code 等现代编辑器能自动检测编码所以不受影响。
受影响文件(17 个)
阶段①-Linux基础-全课复习.md
阶段①-Linux基础-第4课-Shell脚本编程基础.md
阶段①-Linux基础-第4课-init.rc启动脚本解析.md
阶段①-Linux基础-第5课-AOSP构建系统入门.md
阶段①-Linux基础-第5课-Makefile与Soong构建系统入门.md
阶段①-Linux基础-第5课-Shell脚本编程实战.md
阶段①-Linux基础-第6课-Shell脚本编程实战.md
阶段①-Linux基础-第7课-Linux进程管理与网络基础.md
阶段①-Linux基础-综合复习宝典.md
阶段①-Linux基础-综合复习练习题.md
阶段②-C语言-第1课-C语言基础回顾与AOSP视角.md
阶段②-C语言-第2课-函数与指针入门.md
阶段②-C语言-第2课-函数与指针入门(AOSP视角).md
阶段②-C语言-第3课-指针进阶与内存管理.md
阶段②-C语言-第4课-字符串处理与文件IO-AOSP视角.md
阶段②-C语言-第5课-C语言基础与AOSP底层开发入门.md
阶段②-C语言编程-第3课-指针深入与字符串安全处理(AOSP视角).md
修复方式
使用 Python 给所有缺少 BOM 的文件添加 UTF-8 BOM 标记:
import os
for fn in os.listdir('.'):
if not fn.endswith('.md'):
continue
with open(fn, 'rb') as f:
data = f.read()
if data[:3] == b'\xef\xbb\xbf':
continue # 已有 BOM,跳过
text = data.decode('utf-8')
with open(fn, 'w', encoding='utf-8-sig', newline='') as f:
f.write(text)
utf-8-sig 是 Python 的编码别名,等同于 UTF-8 with BOM,写入时自动在文件头部添加 EF BB BF。
修复结果
- 修复前:23 个文件中,6 个有 BOM,17 个无 BOM
- 修复后:23 个文件全部有 BOM,内容无损,在 Windows 任何编辑器中均可正常显示中文
预防建议
在 Windows 环境下创建含中文的文本文件时,建议统一使用 UTF-8 with BOM 编码保存,避免编码误判。