正确的数据格式为CSV导出

目前我正在将数据(在客户端)导出为CSV,并使用特定的utf-8编码

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(字节顺序标记) 。 三字节序列: [0xEF, 0xBB, 0xBF]

Microsoft编译器和解释器以及Microsoft Windows上的许多软件(如记事本)将BOM视为所需的幻数,而不是使用启发式。 这些工具在将文本保存为UTF-8时添加了BOM,并且除非BOM存在,或者文件仅包含ASCII字节,否则不能解释UTF-8。

看看这些文章/职位了解更多信息。

  • 邓,Z. 带有BOM的UTF-8是什么意思? 。 DZone 。 [博客]。 检索2012-11-12。
  • 简单。 没有BOM的UTF-8和UTF-8有什么区别? 。 堆栈溢出 。 检索2010-02-08。
 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'); }