39

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 ファイルにペルシア語の文字を入力した場合、問題はありません。

4

3 に答える 3

126

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

最初にメモ帳を開き、次の行を書きました。それから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' です)。

于 2010-11-16T09:57:23.030 に答える
8

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

あなたの選択肢:

  • XML に書き込み (適切に行えばエンコード メタデータが含まれます)、ユーザーに XMLを Excel にインポートしてもらいます。
  • Apache POIを使用して、実際の Excel ドキュメントを作成します。
于 2010-11-16T09:46:05.013 に答える
5

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

いくつかのペルシャ文字を含む Excel ファイルを作成し、それを CSV ファイルとして保存できます。次に、小さな Java プログラムを作成してこのファイルを読み取り、いくつかの一般的なエンコーディングをテストします。これは、CSV ファイル内のドイツ語のウムラウトの正しいエンコーディングを把握するために使用した方法です。

于 2010-11-16T08:32:17.487 に答える