web-dev-qa-db-ja.com

JavaScriptから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+ "\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値でエクスポートを行うにはどうすればよいですか?

51
Boltosaurus

次のように、テキストの先頭にUTF-8 BOMを追加する必要があります。

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

Excel 2013でうまくいきました。

デモフィドル

81
Gergő Nagy

最初にBOMを追加し、このコードを使用して試すことができます

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

次に、データを使用してファイルヘッダーを作成します: "text/csv; charset = utf-8"

64
Marcelo Lujan

Excelはエンコード、特にOSX上のExcelの検出が非常に苦手です。

最善の解決策は、CSVをデフォルトのExcelエンコードである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');
15
b4stien

オプション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

オプション

data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==のようなbase64 url​​形式を使用します。このメソッドは、クライアント側(IE10 +、FF、Chrome、Opera、Safari)でも機能します。

例えば:

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

何らかの理由で、BOMを使用したutf-16leエンコーディングのTab-Separated-CSVが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テストの場合:

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

B4stien、答えてくれてありがとう!文字セット "utf8"に基づいたいくつかのソリューションをテストした後、Excel-1でアクセントを維持できる唯一のソリューションは、windows-1252のエンコードです。

Manetsus、b4stienの答えと彼のリンクは私の場合非常に便利でした:フランス語とドイツ語のデータをcsvファイルにエクスポートする必要があります:「utf8」に基づくソリューションは機能しません...「ANSI」を使用する彼のソリューション(ウィンドウ-1252)エンコーダー...

私は彼のコードサンプルを提供し、リンクから依存するencoding-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>

それにもかかわらず、Excelは言語と形式のサポートで比較的オープンなので、UTF8がインストール方法のために私の開発環境でサポートされていないことを除外しません...

注:Firefoxでテストします。ChromeおよびIE 11、Windows 7、Excel 365 ...

0
Didier68