web-dev-qa-db-ja.com

JavascriptエクスポートCSVエンコーディングUTF-8の問題

JavaScript配列をCSVファイルにエクスポートしてダウンロードする必要があります。私はそれをしましたが'ı、ü、ö、ğ、ş'この文字はCSVファイルで'ıüöğş'のように見えますこのサイトで推奨されている多くの解決策を試しましたが、うまくいきませんでした。

コードスニペットを追加しました。この問題は誰でも解決できますか?

var csvString = 'ı,ü,ö,ğ,ş';

var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(csvString));
a.setAttribute('download', 'example.csv');
a.click();
16
Can Bozdemir

これは、どのプログラムが_example.csv_ファイルを開いているかによって異なります。テキストエディタを使用すると、エンコーディングは_UTF-8_になり、文字の形式が正しくなくなります。ただし、Excelを使用すると、CSVのデフォルトのエンコードはANSIであり、_UTF-8_ではありません。したがって、Excelではなく_UTF-8_をエンコードとして使用してANSIを強制しないと、文字の形式が不正になります。

Excelは、CSVByte Order Mark )をファイルの最初の文字として置くことで、_UTF-8_ for BOMを使用して強制できます。 _UTF-8_のデフォルトのBOMは、バイトシーケンス_0xEF,0xBB,0xBF_です。したがって、文字列の最初のバイトとして_"\xEF\xBB\xBF"_を置くだけで解決できると考えることができます。しかし、それは確かに単純すぎるでしょうね。 ;-)これの問題は、JavaScriptがそれらのバイトを文字として扱わないようにする方法です。 特殊文字(JavaScript) で説明されているように、「ソリューション」は「ユニバーサルBOM」_"\uFEFF"_を使用しています。

例:

_var csvString = 'ı,ü,ü,ğ,ş,#Hashtag,ä,ö';
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();_

string/BlobへのUTF-8 BOMの追加 も参照してください。

これを使用すると、エンコーディングが正しくなります。それにもかかわらず、これは、コンマがWindowsロケール設定のデフォルトのリスト区切り文字である場合にのみ適切に機能します。そうでない場合、たとえばセミコロンがWindowsロケール設定のデフォルトのリスト区切り文字である場合、すべてのコンテンツはコンマで区切られずに最初の列に配置されます。次に、CSVでも区切り文字としてセミコロンを使用する必要があります。しかし、これは別の問題であり、CSVをまったく使用せず、Excelファイル(_*.xls_または_*.xlsx_)を直接作成できるライブラリを使用するという結論ではないにつながります。

41
Axel Richter