CSV 表格导出内容乱码问题排查
问题描述
在后台项目中,数据导出功能经常被使用。但导出的 CSV 文件内容有时会出现乱码问题。
问题排查
已知:
- 并非每次导出都会出现乱码,只有特定筛选结果才会。
- 已设置
Content-Type, 为text/csv。 - 已在
Content-Type中添加charset=utf-8。
排查过程:
- 复现问题:复制下载链接重新下载文件,确认乱码情况。
- 检查文件编码:打开文件,确认是否为 UTF-8 编码。
- 验证:使用 UTF-8 编码重新打开文件,内容显示正常,确认乱码由编码问题引起。
问题原因
CSV 文件本质上是纯文本,不包含编码信息。
因此,Excel 在打开 CSV 文件时,会根据系统默认编码进行解析。
Excel 对编码有一定的智能检测能力,会尝试判断文件的编码。
- 对于大文件,字节样本充足,Excel 可以准确识别 UTF-8 编码,避免乱码。
- 对于小文件,字节样本不足,Excel 无法准确识别,可能使用系统默认编码解析,从而出现乱码。
解决方案
使用 BOM (Byte Order Mark, 字节顺序标记) 可以解决乱码问题。
BOM 是 Unicode 标准的一部分,是一个特殊的字符序列,放置在文件开头,用于标识文件编码格式与字节顺序,帮助程序正确识别文件内容。
BOM 是为了解决不同计算机设备之间的字节顺序问题而设计的。早期,不同的架构使用不同的字节顺序。
- 大端序 (Big Endian): 高字节存储在低地址。
- 小端序 (Little Endian): 低字节存储在高地址。
| 编码 | BOM 十六进制 | BOM 字符 |
|---|---|---|
| UTF-8 | EF BB BF | \uFEFF |
| UTF-16 LE | FE FF | \uFEFE |
| UTF-16 BE | FF FE | \uFFFE |
| UTF-32 LE | FF FE 00 00 | \uFFFE |
| UTF-32 BE | 00 00 FE FF | \uFEFF |
将 BOM 字符添加到 CSV 内容开头,即可解决乱码问题,例如:
response.send('\uFEFF' + csv)
CSV 表格导出内容乱码问题排查
https://www.inksha.com/archives/csv-biao-ge-dao-chu-nei-rong-luan-ma-wen-ti-pai-cha