在java和csv文件中设置UTF-8

meh*_*hdi 33 java csv unicode utf-8 opencsv

我正在使用此代码通过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();
}
Run Code Online (Sandbox Code Playgroud)

当我打开生成的csv文件时,在Excel中,它包含"ứỶờịỆ".其他程序,如notepad.exe没有此问题,但我的所有用户都使用MS Excel.

用SuperCSV替换OpenCSV并不能解决这个问题.

当我手动将波斯字符键入csv文件时,我没有任何问题.

Ale*_*exR 109

我花了一些时间,但找到了解决问题的方法.

首先我打开记事本并写下以下一行:????,你好,?????? 然后我使用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();
Run Code Online (Sandbox Code Playgroud)

当我使用excel打开这个文件时,我看到了"gibrish".

然后我尝试读取2个文件的内容,并且(如预期的那样)看到记事本生成的文件包含3个字节的前缀:

    239 EF
    187 BB
    191 BF
Run Code Online (Sandbox Code Playgroud)

所以,我修改了我的代码,首先打印此前缀,之后是文本:

    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();
Run Code Online (Sandbox Code Playgroud)

它奏效了!我使用excel打开文件并按预期看到了文本.

底线:在写入内容之前写下这3个字节.此前缀表示内容为"带BOM的UTF-8 "(否则它只是"没有BOM的UTF-8").

  • http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 (4认同)

Mic*_*rdt 8

不幸的是,CSV是一种非常特殊的格式,没有元数据,也没有真正的标准要求灵活的编码.只要您使用CSV,就无法可靠地使用ASCII之外的任何字符.

你的选择:

  • 写入XML(如果你做得对,它确实有编码元数据)并让用户将XML导入Excel.
  • 使用Apache POI创建实际的Excel文档.


chk*_*kal 5

Excel 不UTF8用于打开 CSV 文件。这是一个已知的问题。实际使用的编码取决于 Microsoft Windows 的区域设置。例如,使用德语 lcoale,Excel 将打开一个 CSV 文件,扩展名为CP1252.

您可以创建一个包含一些波斯字符的 Excel 文件并将其另存为 CSV 文件。然后编写一个小的Java程序来读取这个文件并测试一些常见的编码。这就是我用来找出 CSV 文件中德语变音符号的正确编码的方式。

  • 不幸的是这是错误的。我设法创建了可以用 excel 打开的带有 unicode 符号的 CSV 文件。稍后看我的评论 (3认同)