Javascript导出CSV编码utf-8问题

时间:2017-02-25 23:14:59

标签: javascript excel csv encoding utf-8

我需要将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();

1 个答案:

答案 0 :(得分:18)

这取决于打开example.csv文件的程序。使用文本编辑器,编码将为UTF-8,并且字符不会格式错误。但使用Excel CSV的默认编码为ANSI而不是UTF-8。因此,如果不强制Excel使用ANSIUTF-8作为编码,则字符将会格式错误。

Excel可以强制使用UTF-8 CSVBOMByte Order Mark)作为文件中的第一个字符。 BOM的默认UTF-8是字节序列0xEF,0xBB,0xBF。所以我们可以认为简单地将"\xEF\xBB\xBF"作为字符串的第一个字节就是解决方案。但这肯定太简单了,不是吗? ;-)这个问题是如何强制JavaScript不将这些字节作为字符。 “解决方案”使用Special Characters (JavaScript)中提到的“通用BOM”"\uFEFF"

示例:

var csvString = 'ı,ü,ü,ğ,ş';
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或{{1} })。