Javascript到csv导出编码问题

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

我需要将javascript数组导出到excel文件并下载它,我正在用这段代码进行这项工作。数据是一个javascript对象数组

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上可读,应应用以下规则:

  • 用制表符而不是逗号分隔字段(以便MacOS上的Excel可以正确显示生成的CSV文件)
  • 使用UTF-16小尾端(UTF16-LE)而不是UTF-8对字符串/内容进行编码
  • 在序列化流的开头添加RFC2781第3.2节中规定的字节顺序标记(BOM)0xFEFF,以明确提供用UTF16-LE编码的内容的“签名”

  • 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);