CSV导出中文乱码怎么解决?

百里振巧 阅读 13

我用JavaScript把表格数据导出成CSV文件,英文正常,但中文全是乱码,试过加BOM头还是不行。

现在导出的代码是这样的:

const csvContent = "data:text/csv;charset=utf-8," + encodeURIComponent(csv);
const link = document.createElement("a");
link.href = csvContent;
link.download = "data.csv";
link.click();

网上说要加uFEFF,但我加了也没用,打开Excel还是乱码,到底该怎么处理?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
司徒雨妍
你这问题我太熟了,Excel对CSV的编码支持特别“智能”——它压根不认UTF-8,尤其中文版Excel默认用GBK打开CSV,你就算加了uFEFF(BOM),它有时候也装瞎。

核心问题在于:浏览器生成的CSV用UTF-8,但Excel默认按系统本地编码(比如中文Windows是GBK)去解析,自然就乱码了。

解决方案有俩靠谱路子:

第一个,直接转成GBK编码再导出,Excel看了就认:

function utf8ToGb2312(str) {
// 用Blob + TextEncoder 转成 GBK
const encoder = new TextEncoder('gb2312'); // 注意:现代浏览器 TextEncoder 默认只支持 utf-8,这招其实有坑
// 更稳妥的是用 iconv-lite,但浏览器端用不了……
return str;
}


别急,浏览器里没直接转GBK的好办法,别死磕这个。

第二个方案,也是最靠谱的——用Excel能识别的UTF-8 with BOM,但BOM必须是0xEF 0xBB 0xBF,而且必须放在整个数据最前面,不能加在encodeURIComponent之后。

你现在的写法是错的,因为encodeURIComponent会把BOM字符也编码掉,Excel拿到的就不是BOM了。

正确做法是:

// 先拼好原始CSV字符串
let csv = "标题1,标题2n值1,值2n";

// 添加 UTF-8 BOM(注意:必须是原始字节,不能是字符串"uFEFF")
const bom = 'uFEFF'; // 这是JS里的BOM字符
csv = bom + csv;

// 然后用Blob,别用data URI
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "data.csv";
link.click();
URL.revokeObjectURL(link.href); // 记得释放


注意几个关键点:

1. blob必须用new Blob创建,别用data:text/csv...那种老式写法,BOM会被污染
2. BOM字符'uFEFF'要加在字符串最前面
3. type写成text/csv;charset=utf-8;,结尾带个分号更保险(某些老版Excel认这个)

我之前在WP里导出插件数据也踩过这坑,试了BOM+Blob之后,Excel 2016/2019/2021全OK,包括mac版Excel也行。

如果你用的是老浏览器(比如IE),那另说,但现在谁还用IE导CSV啊……
点赞 3
2026-02-24 22:24