CSV导出中文乱码怎么解决?
我用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. 只加了BOM头但没考虑Excel的特殊处理逻辑
2. 直接用了encodeURIComponent可能有问题
试试这个改进方案:
关键点:
- 用Blob代替直接的dataURL,编码更可靠
- BOM头必须放在文件最开头(uFEFF)
- 确保type里明确指定charset=utf-8
- 用完记得释放内存(removeChild和revokeObjectURL)
如果还不行,建议直接导出xlsx格式,用sheetjs这类库处理,虽然重一点但兼容性更好。不过对性能有要求的场景,上面这个方案在95%的情况下都能work。
uFEFF(BOM),它有时候也装瞎。核心问题在于:浏览器生成的CSV用UTF-8,但Excel默认按系统本地编码(比如中文Windows是GBK)去解析,自然就乱码了。
解决方案有俩靠谱路子:
第一个,直接转成GBK编码再导出,Excel看了就认:
别急,浏览器里没直接转GBK的好办法,别死磕这个。
第二个方案,也是最靠谱的——用Excel能识别的
UTF-8 with BOM,但BOM必须是0xEF 0xBB 0xBF,而且必须放在整个数据最前面,不能加在encodeURIComponent之后。你现在的写法是错的,因为
encodeURIComponent会把BOM字符也编码掉,Excel拿到的就不是BOM了。正确做法是:
注意几个关键点:
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啊……