web-dev-qa-db-ja.com

JavaおよびcsvファイルでUTF-8を設定する

OpenCSV を介してcsvファイルにペルシャ語を追加するためにこのコードを使用しています。

String[] entries="\u0645 \u062E\u062F\u0627".split("#");
try{
    CSVWriter writer=new CSVWriter(new OutputStreamWriter(new FileOutputStream("C:\\test.csv"), "UTF-8"));

    writer.writeNext(entries);
    writer.close();
}
catch(IOException ioe){
    ioe.printStackTrace();
}

結果のcsvファイルをExcelで開くと、 "ứỶờịỆ"が含まれています。 notepad.exeなどの他のプログラムにはこの問題はありませんが、すべてのユーザーがMS Excelを使用しています。

OpenCSVを SuperCSV に置き換えても、この問題は解決しません。

ペルシャ語の文字を手動でcsvファイルに入力した場合、問題はありません。

32
mehdi

残念ながら、CSVはメタデータがなく、柔軟なエンコードを要求する実際の標準がない非常にアドホックな形式です。 CSVを使用している限り、ASCII以外の文字を確実に使用することはできません。

あなたの選択肢:

  • XML(適切にエンコードするとメタデータがエンコードされます)に書き込み、ユーザーに XMLをインポート をExcelに送信します。
  • Apache POI を使用して、実際のExcelドキュメントを作成します。
8

しばらく時間を費やしましたが、問題の解決策を見つけました。

最初にメモ帳を開き、次の行を書きました:שלום、hello、привет次に、UTF-8を使用してファイルhe-en-ru.csvとして保存しました。その後、MS Excelで開きましたが、すべて正常に機能しました。

ここで、この行を次のようにファイルに出力する簡単なJavaプログラムを作成しました。

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    w.print(line);
    w.flush();
    w.close();

Excelを使用してこのファイルを開くと、「ギブリッシュ」が表示されました。

次に、2つのファイルの内容を読み取ろうとしましたが、(予想どおり)メモ帳で生成されたファイルに3バイトのプレフィックスが含まれていることがわかりました。

    239 EF
    187 BB
    191 BF

そこで、最初にこのプレフィックスを、その後にテキストを印刷するようにコードを変更しました。

    String line = "שלום, hello, привет";
    OutputStream os = new FileOutputStream("c:/temp/j.csv");
    os.write(239);
    os.write(187);
    os.write(191);

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));

    w.print(line);
    w.flush();
    w.close();

そしてうまくいきました! Excelを使用してファイルを開くと、期待どおりのテキストが表示されました。

結論:コンテンツを書き込む前にこれらの3バイトを書き込みます。このプレフィックスは、コンテンツが「UTF-8 with [〜#〜] bom [〜#〜] 」であることを示します(それ以外の場合は、「UTF-8 without BOM」です)。

104
AlexR

ExcelはUTF8を使用してCSVファイルを開きません。それは既知の問題です。実際に使用されるエンコーディングは、Microsoft Windowsのロケール設定によって異なります。たとえば、ドイツのlcoaleでは、ExcelはCP1252でCSVファイルを開きます。

いくつかのペルシャ文字を含むExcelファイルを作成し、CSVファイルとして保存できます。次に、小さなJavaプログラムを作成して、このファイルを読み取り、いくつかの一般的なエンコードをテストします。

4
chkal