目录

解决csv中文乱码

Web 应用程序中经常会有导出文件报表的需求,csv 格式结构简单,Python 无需安装第三方库,标准库即可生成 csv 文件,是导出报表的不二首选。然而,如果没有设置好 csv 文件的编码,在 Microsoft Excel 中打开时,可能是一片乱码。

乱码的原因

Python 的默认文件编码为 UTF-8,因此不特别设定的话,生成的 csv 文件也是 UTF-8 编码。

根据参考链接中文章的描述推测(存疑,在 Office 2207 SP2 更新日志中未找到 csv 相关更新内容):

  • Office 2007 版本和 Office 2007 SP1 版本,打开 csv 文件时的默认编码为 ANSI,对应中文即是 GBK 编码;
  • Office 2003、Office 2007 SP2 以及更新的版本,打开 csv 文件时的默认编码还支持带 BOM 头的 UTF-8;

而 Python 语言(或者说大多数编程语言)默认的 UTF-8 是不带 BOM 头的,因此不管用什么版本的 Microsoft Office 打开都会乱码。

解决方案

其实在 Office Excel 中,可以选择在数据菜单中“从文件导入”的方式读取 csv,该过程中可以指定 csv 文件的编码,就不会乱码了。

但是作为一个 Web 开发者,为了提高用户体验,还是希望用户能够直接打开 csv 文件而不乱码。我们可以通过在生成 csv 文件时,指定 csv 文件编码实现:

  • 若需要兼容 Office 2007 和 Office 2007 SP1,使用 GBK 编码(Python 中该编码为gbk),但是仅限于中英文内容,其他语言 GBK 可能无法编码或乱码;
  • 若不需要兼容 Office 2007 和 Office 2007 SP1,使用带 BOM 头的 UTF-8 编码(Python 中该编码为utf-8-sig),对多语言的支持更加友好;

需要特别注意的是,一般业务中可能没有其他外文语言,但会有 emoji 表情。这些 emoji 表情是无法用 GBK 编码的,注意做好容错。举个 Python 的例子,使用 ? 代替无法编码的字符:

1
str.encode('gbk', errors='replace')

参考链接