导出的 CSV 文件出现乱码

导出 CSV 格式的用户列表时,如果 name 包含非 ASCII 字符和数字,则会导致乱码:

我找到了两种解决此问题的方法:

  1. 在 Excel 中创建一个新的 XLSX 文件,使用“从文本/CSV”选项导入数据,并将文件来源调整为 Unicode (UTF-8)


    image

  2. 使用 Notepad++ 打开 CSV 文件,并将编码从 UTF-8 更改为 UTF-8-BOM

结果:

尽管这些方法都能有效解决表面问题,但它们都没有解决根本原因。


经过进一步研究,我发现了一个潜在的长期解决方案:

// 处理生成 CSV 的过程,其中“body”代表数据行,“header”代表标题行。
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// Excel 需要字节顺序标记 (BOM) 来指示文件是 UTF-8 编码的。
const BOM = Buffer.from('\uFEFF');

// 将 BOM 标头与生成的 CSV 内容连接起来。
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// 将结果缓冲区转换为字符串并返回。
return bomCsv.toString();

// 一旦返回的字符串被下载并用 Excel 打开,它将在电子表格中正确显示中文内容。

本质上,Excel 需要元数据来指定 CSV 文件的编码。微软为此引入了 BOM(字节顺序标记)标头。虽然其他电子表格软件可能会忽略此标头,但它对 Excel 来说非常重要。为了确保跨软件兼容性,在生成 CSV 时包含 BOM 标头至关重要。

我想知道您的团队是否计划在即将发布的版本中包含此解决方案?这样做有可能扩展语言支持并减少错误的发生。

感谢您对此事的关注!

参考:
https://www.zhihu.com/question/21869078/answer/350728339

1 个赞