在 java 和 csv 文件中设置 UTF-8 [重复]

Posted

技术标签:

【中文标题】在 java 和 csv 文件中设置 UTF-8 [重复]【英文标题】:setting a UTF-8 in java and csv file [duplicate] 【发布时间】:2011-05-10 16:22:36 【问题描述】:

我正在使用此代码通过 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。

将 OpenCSV 替换为 SuperCSV 并不能解决此问题。

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

【问题讨论】:

绝对是一模一样的副本。我刚刚使用上面链接中的解决方案尝试了这个问题(使用 BOM 使 Excel 以 UTF-8 读取),它解决了这个问题。或者,显然使用 UTF-16 也可以强制 Excel 读取不是 ASCII 格式的 CSV。 有一个类似于 AlexR 的帖子的有用链接! weblogs.java.net/blog/joconner/archive/2010/03/24/… 【参考方案1】:

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

首先我打开记事本并写下以下行:שלום, 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')。

【讨论】:

en.wikipedia.org/wiki/Byte_order_mark#UTF-8 感谢您的科学描述。很高兴知道... 您使用哪个版本的 Microsoft Excel 进行测试? +1 真的有效!!!谢谢 也为我工作。我把那个放在我的后兜里!【参考方案2】:

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

你的选择:

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

【讨论】:

XML 和 POI 都可以,但 CSV 也可以。请看我的评论。我设法创建了包含 unicode 符号并且可以用 MS excel 打开的 CSV 文件。 @AlexR:这可能适用于任何给定版本的 Excel 或其他程序,也可能不适用,或者可能导致文件因无效而被拒绝,或将一些虚假字符放入第一个单元格。您的程序的行为不应依赖于未记录的功能。 @AlexR 你能帮帮我吗。我有类似的问题***.com/questions/66331230/…【参考方案3】:

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

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

【讨论】:

很遗憾这是错误的。我设法创建了可以用 excel 打开的带有 unicode 符号的 CSV 文件。稍后看我的评论

以上是关于在 java 和 csv 文件中设置 UTF-8 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle APEX 中设置 SPOOL 脚本以将视图数据导出为 CSV?

如何在 pandas to_csv() 中设置自定义分隔符?

在一个类中设置一个函数,该函数将以一种可以在未来函数中引用的方式读取 csv 数据

如何在 Spring Boot 中设置 UTF-8 字符编码?

Linux 中设置 MySQL 字符集为 UTF-8

如何在熊猫中设置第一列和第一行作为索引?