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();
}

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

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

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

4

3 回答 3

126

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

首先我打开记事本并写下以下行:שלום, 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 打开这个文件时,我看到了“gibrish”。

然后我尝试读取 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

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

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

于 2010-11-16T08:32:17.487 回答