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

2022-09-01 03:25:23

我正在使用此代码通过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文件时,它包含“ứỶờịỆ”。其他程序(如记事本.exe没有这个问题,但我的所有用户都在使用MS Excel。

SuperCSV取代OpenCSV并不能解决这个问题。

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


答案 1

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

首先,我打开记事本并写下以下行:שלום,你好,привет 然后我将其保存为文件he-en-ru.csv使用UTF-8。然后我用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个字节。此前缀表示内容采用“带 BOM 的 UTF-8”(否则只是“不带 BOM 的 UTF-8”)。


答案 2

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

您的替代方案:

  • 写入 XML(如果操作正确,则具有编码元数据),并让用户将 XML 导入 Excel。
  • 使用 Apache POI 创建实际的 Excel 文档。