CSV文件要不要使用UTF-8-BOM字符编码

代码用 UTF-8-BOMutf-8-sig)生成 CSV 文件,就是为了 Windows 下双击 CSV 用 Excel 打开时中文不乱码,就是一种妥协性的操作。

这背后的故事值得讲清楚,因为 UTF-8 理论上不需要 BOM,但 Excel 偏偏靠 BOM 认编码——这就是矛盾的根源。

1)BOM 是什么?为什么叫 “UTF-8 with BOM”

BOM = Byte Order MarkU+FEFF,在 UTF-8 编码下就是文件最开头的 3 个字节

1
EF BB BF

它对 UTF-8 来说是多余的(UTF-8 字节序固定,不需要 FEFF 来判定)。BOM 存活到现在,纯粹是靠Windows 历史包袱在养着。而对于Linux/macOS 这边:BOM 是"不受欢迎的客人"。

Excel 在 Windows 下默认使用系统 ANSI 编码(中文即为 GBK)去解析无 BOM 的 UTF-8 文件。你编写的“无 BOM” CSV 文件,很可能会被 Excel 误读,从而显示为乱码。而 UTF-8 BOM(也就是那三个看不见的字符 \uFEFF),就像贴在文件开头的“我用了 UTF-8 哦”的小贴士,让 Excel 能正确“认识”它,避免“鸡同鸭讲”的乱码局面。

2)Excel 到底怎么对待 CSV 编码(重点)

微软自己的支持文档说得很直白:

如果 CSV 文件是以 BOM 储存的,则可以正常开启 UTF-8 编码的 CSV 文件;否则需要通过 数据 → 从文字/CSV(Power Query) 手动指定编码。

翻译成人话就是——Windows 版 Excel 的两条打开路径:

打开方式 无 BOM(纯 UTF-8) 有 BOM(UTF-8-BOM)
双击 .csv(默认关联) ❌ 回退到系统 ANSI(简中 = GBK)→ 中文乱码 ✅ 识别为 UTF-8,正常显示
Excel → 数据 → 从文字/CSV → 手动选 UTF-8 ✅ 能显示(但要人手动操作) ✅ 自动识别

所以 BOM 解决的不是"编码对错",而是"Excel 偷懒不猜对"的问题

微软甚至把 BOM 称为 “signature”,明确建议用于 CSV 的 UTF-8 场景。

3)我的建议:有条件推荐 BOM,但要意识到代价

✅ 什么时候建议用 utf-8-sig(即带 BOM)

满足以下条件就 放心用

  • 你的 CSV 交付给别人用,对方大概率 双击 → Excel 打开
  • 对方环境是 Windows + 传统 Excel(2016/2019/2021/MS 365 但用双击路径)
  • 文件里有 中文/日文/韩文等非 ASCII

这时候 BOM 是性价比最高的防乱码手段,3 个字节换来不吵架。

1
2
# pandas
df.to_csv("output.csv", encoding="utf-8-sig", index=False)
1
2
3
4
# 原生 open
with open("output.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(...)

utf-8-sig 的意思就是:写 UTF-8,但文件开头自动塞 EF BB BF


⚠️ 什么时候 BOM 会带来麻烦(所以不是"永远无脑好")

场景 问题
这个 CSV 要 被程序再次读取(Python / R / awk / sed / shell pipe) 大多没事,但极少数旧工具会把 BOM 当首行的第一个字符吃掉,导致首列名变成 �姓名 或解析首行出错
Git Git 有时会把它当"差异";但一般无害(可配置 .gitattributes
Mac / Linux 用户 Mac 版 Excel 对无 BOM 的 UTF-8 更宽容,但 BOM 也不伤(就是多 3 字节)
你追求"语义纯洁" UTF-8 不需要 BOM,BOM 违背 Unicode 标准精神 → 所以有人反感

4)所以给我一句最终立场

如果你的目标受众是"人(尤其 Windows 用户)用 Excel 双击看"→ 用 utf-8-sig(带 BOM),这是对的、务实的、行业标准妥协。
如果这个 CSV 是"数据管道的中间产物 / 给下游脚本读"→ 用纯 utf-8(无 BOM),更干净。

换句话说:BOM 不是为编码正确性而存在,是为 Excel 兼容性而存在。

我的看法

我是 linux 派,我不喜欢BOM ,还是不要更改字符编码,统一使用 UTF-8 格式最好。

  1. 分析:绝对不采用 BOM 格式

  2. 交付客户:

    • 数据量小,用 EXCEL 表更好

    • 数据量大,用 UTF-8 格式的 txt 格式(因为生成 csv 或 excel ,客户用excel也打不开)。如果生成 csv (UTF-8 格式)就要确保无中文

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信