我需要将 javascript 数组导出到 CSV 文件并下载。我做到了,但是 'ı,ü,ö,ğ,ş' 这些字符在 CSV 文件中看起来像 'ı ü ö ÄŸ ÅŸ'。我尝试了该网站上推荐的许多解决方案,但对我没有用。
我添加了我的代码片段,任何人都可以解决这个问题吗?
var csvString = 'ı,ü,ö,ğ,ş';
var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(csvString));
a.setAttribute('download', 'example.csv');
a.click();
最佳答案
这取决于打开 example.csv
文件的程序。使用文本编辑器,编码将为 UTF-8
,并且字符不会变形。但是使用 Excel
时,CSV
的默认编码是 ANSI
而不是 UTF-8
。因此,如果不强制 Excel
使用 UTF-8
而不是 ANSI
作为编码,字符将会出现格式错误。
Excel
可以强制使用 UTF-8
为 CSV
放置一个 BOM
( Byte Order Mark )作为文件中的第一个字符。 UTF-8
的默认 BOM
是字节序列 0xEF,0xBB,0xBF
。因此,人们可能认为简单地将 "\xEF\xBB\xBF"
作为字符串的第一个字节就是解决方案。但那肯定太简单了,不是吗? ;-) 问题在于如何强制 JavaScript 不将这些字节作为字符。 “解决方案”是使用“通用 BOM”“\uFEFF”
,如 Special Characters (JavaScript) 中所述.
例子:
var csvString = 'ı,ü,ü,ğ,ş,#Hashtag,ä,ö';
var universalBOM = "\uFEFF";
var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(universalBOM+csvString));
a.setAttribute('download', 'example.csv');
window.document.body.appendChild(a);
a.click();
另见 Adding UTF-8 BOM to string/Blob .
使用它,编码将是正确的。但是,尽管如此,这只有在 Windows
区域设置中的默认列表分隔符为逗号时才能正常工作。如果不是,例如分号是 Windows
语言环境设置中的默认列表分隔符,则所有内容都将位于第一列,而不用逗号分隔。然后你还必须在 CSV
中使用分号作为分隔符。但这是另一个问题,导致结论不根本不使用CSV
,而是使用可以直接创建Excel
文件的库(* .xls
或 *.xlsx
)。
关于Javascript 导出 CSV 编码 utf-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462764/