Javascript到csv导出编码问题
我需要将javascript数组导出到excel文件并下载它,我正在用这段代码进行这项工作。数据是一个javascript对象数组Javascript到csv导出编码问题,javascript,csv,export-to-csv,Javascript,Csv,Export To Csv,我需要将javascript数组导出到excel文件并下载它,我正在用这段代码进行这项工作。数据是一个javascript对象数组 var csvContent = "data:text/csv;charset=utf-8,"; data.forEach(function(dataMember, index) { dataString = dataMember.join(","); csvContent += index < data.length ? dataString
var csvContent = "data:text/csv;charset=utf-8,";
data.forEach(function(dataMember, index)
{
dataString = dataMember.join(",");
csvContent += index < data.length ? dataString+ "\n" : dataString;
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "upload_data" + (new Date()).getTime() + ".csv");
link.click();
var csvContent=“数据:文本/csv;字符集=utf-8,”;
forEach(函数(dataMember,index)
{
dataString=dataMember.join(“,”);
csvContent+=索引
所有这些东西都可以正常工作,直到我有了非英语字符的字符串属性,比如西班牙语、阿拉伯语或希伯来语。如何使用所有这些非ASCII值进行导出?选项1 使用
iconv-lite
库并将输出编码为ascii,然后再将其发送回用户。
例如:
选项2
在文件头上写入UTF-8编码的BOM头。
例如:
选项3
使用base64 url格式,如数据:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==
。这种方法也适用于客户端(IE10+、FF、Chrome、Opera、Safari)
例如:
window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
您应该在文本开头添加UTF-8 BOM,如:
var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent);
用Excel 2013对我来说很有用
Excel在检测编码方面非常糟糕,尤其是OSX上的Excel 最好的解决方案是使用默认的Excel编码对CSV进行编码:windows-1252(也称为ANSI,基本上是ISO-8859-1的子集) 我在以下位置给出了一个完整的示例: 这两个主要部分是(在windows-1252中对CSV的内容进行编码)和(下载生成的Blob) 它看起来像:
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new TextEncoder('windows-1252');
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, 'some-data.csv');
不知怎的,在WIN/MAC Excel上找到了标签分隔的CSV,带有utf-16le编码和BOM 遵循b4stien的答案,但对存档有一点影响:
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new TextEncoder('utf-16le');
var csvContentEncoded = textEncoder.encode([csvContent]);
var bom = new Uint8Array([0xFF, 0xFE]);
var out = new Uint8Array( bom.byteLength + csvContentEncoded.byteLength );
out.set( bom , 0 );
out.set( csvContentEncoded, bom.byteLength );
var blob = new Blob([out]);
saveAs(blob, 'some-data.csv');
使用Linux/usr/bin/file测试:
Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
B4stien,谢谢你的回答! 在测试了几种基于字符集“utf8”的解决方案后,编码windows-1252是唯一一种允许我在Excel 365中保留重音的解决方案 Manetsus,b4stien的答案和他的链接对我的案例非常有用:我必须将法语和德语数据导出到csv文件中:基于“utf8”的解决方案不起作用。。。只有他的解决方案使用“ANSI”(window-1252)编码器 我给出了他的代码示例,您可以从链接下载dependence-indexes.js、encoding.js和FileSaver.js
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="encoding-indexes.js"></script>
<script type="text/javascript" src="encoding.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
</head>
<body>
<a href="#" id="download-csv">Click me to download a valid CSV !</a>
<script type="text/javascript">
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new CustomTextEncoder('windows-1252', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, fileName);
e.preventDefault();
});
</script>
</body>
</html>
var csvContent='аa;ça;12欧元;çï; 13',
textcoder=new customtextcoder('windows-1252',{NONSTANDARD_allowLegacyEncoding:true}),
文件名='some data.csv';
var a=document.getElementById('download-csv');
a、 addEventListener('click',函数(e){
var csvContent encoded=textcoder.encode([csvContent]);
var blob=new blob([csvContentEncoded],{type:'text/csv;charset=windows-1252;'});
saveAs(blob,文件名);
e、 预防默认值();
});
尽管如此,由于Excel在支持语言和格式方面相对开放,我不排除UTF8在我的开发环境中不受支持,因为它的安装方式
注意:我在windows 7上用Firefox、Chrome和IE 11测试它,用Excel 365…您可以先添加BOM表,然后使用此代码再试一次
var BOM = "\uFEFF";
var csvContent = BOM + csvContent;
然后用数据包装文件标题:“text/csv;charset=utf-8”要导出包含多字节字符的csv,并使其在多个操作系统平台(Windows、Linux、MacOS)的文本编辑器和Excel上可读,应应用以下规则:
NodeJS的进一步阐述、用例和示例代码见。第一行说明utf-8,这是ASCII。也许如果你把它改成16,这会使用unicode,也许?我改了。同样的事情(@Boltosaurus,我在这里创建了一个演示:。我觉得没问题:下载的文件中的特殊字符编码正确。这很奇怪,因为我是这样下载的:),,,,这里有一个关于CSV编码的非常详细的答案:嘿,谢谢你的回答。你能给出选项2的完整示例吗?到底是什么。header()方法?res object到底是什么?我使用的是framework.On plane node.js,你可以使用。我不是说node。我使用的是纯客户端javascript)我为你添加了一个新选项-选项3.es.write(新缓冲区('EFBBBF','hex'));已不再使用。你能在JSFIDLE或其他软件中提供一个完整的工作示例吗?@jlarson给你:我使用了Benoit Blanchon的演示。在Mac上,我最终得到了以下结果:(这对我来说很有效,使用了FileSaver.js。我没有使用URL编码,而是这样做了:var blob=new blob(['\ufeff'+csvString],{type:'text/csv;charset=utf-8'));非常感谢。一年多来我遇到了这个问题,但找不到正确的答案。这!花了很长时间才找到可行的方法。谢谢!当我将我的东西转换为blob,然后使用锚定标记click hack触发下载时,这对我很有效:
var downloadLink=document.createElement(“a”);downloadLink.download=fileNameToSaveAs;downloadLink.href=window.URL.createObjectURL(textFileAsBlob);downloadLink.onclick=function(e){document.body.removeChild(e.target);};下载
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="encoding-indexes.js"></script>
<script type="text/javascript" src="encoding.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
</head>
<body>
<a href="#" id="download-csv">Click me to download a valid CSV !</a>
<script type="text/javascript">
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new CustomTextEncoder('windows-1252', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, fileName);
e.preventDefault();
});
</script>
</body>
</html>
var BOM = "\uFEFF";
var csvContent = BOM + csvContent;
data=`"red","मुकेश"`
var processdata = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURIComponent(data);