解决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 的例子,使用 ?
代替无法编码的字符:
|
|