我目前正在使用特定的 utf-8 编码将数据(在客户端)导出到 CSV
var csvContent = "data:text/csv;charset=utf-8,";
arr.forEach(function(infoArray, index){
var dataString = infoArray.join(",");
csvContent += index < arr.length ? dataString+ "\n" : dataString;
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "data.csv");
document.body.appendChild(link);
link.click();
数据位于arr中,看起来像:
[{'firstname':'John', 'surname':'Doe', 'city':'Paris'}, ... , {'firstname':'Johnny', 'surname':'Done', 'city':'Paris'}]
它工作得很好,预计当我在 Excel 中导入生成的文件时,我有编码错误(例如 É -> Ð),但是当我在 Sublime Text 中打开文件时,一切看起来都很好。
最佳答案
看起来您需要包含 UTF-8 BOM (Byte-Order Mark)在逗号之后和数据开始之前。三字节序列:[0xEF, 0xBB, 0xBF]
。
Microsoft compilers and interpreters, and many pieces of software on Microsoft Windows such as Notepad treat the BOM as a required magic number rather than use heuristics. These tools add a BOM when saving text as UTF-8, and cannot interpret UTF-8 unless the BOM is present, or the file contains only ASCII bytes.
查看这些文章/帖子以获取更多信息。
- 邓Z. What Does UTF-8 With BOM Mean? 。 DZone。 [博客]。检索于 2012 年 11 月 12 日。
- 简单。 What's different between UTF-8 and UTF-8 without BOM? 。 堆栈溢出。检索于 2010 年 2 月 8 日。
var personArr = [
{ firstname: 'John', surname: 'Doe', city: 'Paris' },
// ... ,
{ firstname: 'James', surname: 'Brown', city: 'Barnwell' }
];
var csvData = jsonToCsv({ data : personArr });
var downloadLinkEle = createDownloadLink(csvData, 'people.csv');
document.body.appendChild(downloadLinkEle);
function createDownloadLink(content, filename, text) {
text = text || filename;
var link = document.createElement('a');
link.setAttribute('href', encodeURI(content));
link.setAttribute('download', filename);
link.innerHTML = text;
return link;
}
function jsonToCsv(opts) {
var BOM = "\uFEFF";
opts.data = opts.data || [];
opts.columns = opts.columns || [];
opts.delim = opts.delim || ',';
opts.headers = opts.headers || [ 'text/csv', 'charset=utf-8' ];
if (opts.columns.length < 1 && opts.data.length > 0) {
opts.columns = Object.keys(opts.data[0]);
}
return 'data:' + opts.headers.join(';') + ',' + BOM + [
opts.columns.join(opts.delim),
opts.data.map(rec => opts.columns.map(col => rec[col]).join(opts.delim)).join('\n')
].join('\n');
}
关于javascript - CSV 导出的正确数据格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41634711/