Javascript到csv导出编码问题

时间:2013-10-21 11:06:03

标签: javascript csv export-to-csv

我需要将javascript数组导出到excel文件并下载它我在这段代码中执行此操作。 data是一个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();

所有这些东西都可以正常工作,直到我的字符串属性具有非英语字符,如西班牙语,阿拉伯语或希伯来语。如何使用所有这些非ASCII值进行导出?

8 个答案:

答案 0 :(得分:77)

您应该在文本的开头添加UTF-8 BOM,例如:

var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";

Excel 2013适用于我。

<强> Demo Fiddle

答案 1 :(得分:57)

您可以先添加BOM,使用此代码并尝试

var BOM = "\uFEFF"; 
var csvContent = BOM + csvContent;

然后用数据创建文件头:“text / csv; charset = utf-8”

答案 2 :(得分:15)

Excel在检测编码方面非常糟糕,特别是在OSX上的Excel。

最佳解决方案是使用默认的Excel编码对CSV进行编码:windows-1252(也称为ANSI,基本上是ISO-8859-1的子集)。

我在https://github.com/b4stien/js-csv-encoding上提供了一个如何执行此操作的完整示例。

2个主要部分是stringencoding(用于在Windows-1252中对CSV的内容进行编码)和FileSaver.js(用于下载生成的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');

答案 3 :(得分:3)

选项1

使用iconv-lite库并将输出编码为ascii,然后再将其发送回用户。 例如:

var iconv = require('iconv-lite');
buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding

选项2

在文件的头部写入UTF-8编码的BOM头。 例如:

res.header('Content-type', 'text/csv; charset=utf-8');
res.header('Content-disposition', 'attachment; filename=excel.csv'); 
res.write(Buffer.from('EFBBBF', 'hex')); // BOM header

// rest of your code

选项3

使用类似data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==的base64网址格式。此方法也适用于客户端(IE10 +,FF,Chrome,Opera,Safari)。

例如:

window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");

答案 4 :(得分:2)

以某种方式找到带有utf-16le编码的Tab-Separated-CSV,BOM在WIN / MAC Excel上工作

遵循了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 tests:

Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators

答案 5 :(得分:0)

B4stien,谢谢你的回答! 在基于charset&#34; utf8&#34;测试了几个解决方案之后,编码windows-1252是唯一能让我在Excel 365中保持重音的解决方案!

Manetsus,b4stien的回答和他的链接对我的案例非常有用:我必须将法语和德语数据导出到csv文件中:没有基于&#34; utf8&#34;的解决方案。已经工作......只有他的解决方案使用&#34; ANSI&#34; (window-1252)编码器......

我提供了他的代码示例,您可以从链接中下载依赖编码索引.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>

尽管如此,由于Excel在支持语言和格式方面相对开放,我不排除我的开发环境中不支持UTF8,因为它的安装方式......

注意:我在Windows 7上用Firefox,Chrome和IE 11测试它,使用Excel 365 ...

答案 6 :(得分:0)

要导出包含多字节字符的CSV并使其在多个OS平台(Windows,Linux,MacOS)上的文本编辑器和Excel中可读,应遵循以下规则:

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

this article中可以看到有关NodeJS的详细说明,用例和示例代码。

答案 7 :(得分:0)

 data=`"red","मुकेश"`
 var processdata = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURIComponent(data);