これはexample.csv
ファイルを開いているどのようなプログラムに依存します。テキストエディタを使用すると、エンコードはUTF-8
になり、文字は不正な形式にはなりません。しかしExcel
を使用すると、CSV
のデフォルトエンコードはANSI
であり、UTF-8
ではありません。したがって、Excel
をANSI
ではなく、UTF-8
を使用して強制的にエンコードすると、文字の形式が正しくありません。
Excel
は、ファイルの最初の文字としてBOM
(Byte Order Mark)を置くとCSV
ためUTF-8
を使用して強制することができます。 UTF-8
のデフォルトBOM
は、バイトシーケンス0xEF,0xBB,0xBF
です。だから、文字列に最初のバイトとして"\xEF\xBB\xBF"
を入れるだけで解決できると思うかもしれません。しかし確かにそれは簡単すぎるだろうか? ;-)この問題は、JavaScriptがそれらの文字を文字として受け取らないようにする方法です。 「解決法」は、Special Characters (JavaScript)で言及されているように、「ユニバーサルBOM」"\uFEFF"
を使用しています。
例:
var csvString = 'ı,ü,ü,ğ,ş';
var universalBOM = "\uFEFF";
var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(universalBOM+csvString));
a.setAttribute('download', 'example.csv');
window.document.body.appendChild(a);
a.click();
もAdding UTF-8 BOM to string/Blobを参照してください。
これを使用すると、エンコードが正しく行われます。それにもかかわらず、これはあなたのWindows
ロケール設定のカンマがデフォルトのリストセパレータである場合にのみ正しく動作します。そうでない場合は、ロケール設定のセミコロンがデフォルトの区切り文字である場合、すべてのコンテンツはコンマで区切られずに最初の列に表示されます。次に、CSV
でもセミコロンを区切り記号として使用する必要があります。しかし、これは別の問題であり、ではなくを使用して、のファイル(*.xls
または*.xlsx
)を直接作成できるライブラリを使用しても、CSV
を使用するという結論に至ります。
このブラウザは 'data'-URIsをこのように使用することをサポートしていないので、この解決策は' Internet Explorer'では動作しないことはご存知でしょう。しかし、少なくともあなたは 'Firefox'を使って作業するべきです。 'Firefox'は、DOMに追加されていない要素に対して' click'イベントを受け付けません。だからあなたは 'A'要素をDOMに追加するだけでなく、それを作成する必要があります。私の答えの例を見てください。しかし、私の結論も読んでください。このように 'CSV 'を使うことは解決策ではなく、多くの問題の一部です。 –