Web 应用常需要导出报表。CSV 结构简单,Python 标准库即可生成,但若编码设置不当,用户用 Microsoft Excel 打开时往往出现中文乱码。
乱码的原因
Python 默认使用 UTF-8 保存文件,因此导出的 CSV 也是 UTF-8。根据参考资料 (存疑,在 Office 2207 SP2 更新日志中未找到 CSV 相关更新内容) ,不同版本 Excel 对 CSV 的默认编码不同:
- Office 2007 与 2007 SP1 默认按 ANSI(在中文环境约等于 GBK)解析;
- Office 2003、Office 2007 SP2 及更新版本支持带 BOM 的 UTF-8;
- 多数编程语言默认输出的 UTF-8 不带 BOM,因此 Excel 仍会误判编码,导致乱码。
解决方案
用户可在 Excel 的“数据 → 自文本/CSV”导入流程中手动选择编码,但体验较差。作为 Web 开发者,我们通常希望文件直接双击打开就正常显示,可在导出时统一编码:
- 需兼容 Office 2007 / 2007 SP1 时,改用 GBK 编码(Python 中传入
encoding="gbk"
); - 若目标用户均使用更新版本 Excel,可使用带 BOM 的 UTF-8(编码名
utf-8-sig
),多语言支持更好。
注意事项:
- GBK 无法编码 emoji 等非中英文字符,可通过
errors="replace"
等方式容错:
content.encode('gbk', errors='replace')
- 若业务确实需要写入 emoji,建议统一采用
utf-8-sig
,并告知用户升级 Excel 版本。