【问题标题】:ö character encoding issue in CSV file creationö CSV 文件创建中的字符编码问题
【发布时间】:2014-05-21 12:27:41
【问题描述】:

我正在尝试从我的 Java 代码创建一个 CSV 文件。

    File file = File.createTempFile("DummyReport", ".csv");
    SomeListofObjects items = getSomeList();
    FileUtils.write(file, "ID;CREATION;" + System.lineSeparator());
    FileUtils.writeLines(file, activities.getItems(), true);        
    return file;

我遇到了一些特殊字符的问题。

当我调试代码时,我发现我有一个字符为“ö”。但是在生成的 csv 文件中,它奇怪地出现了“ö”。

我们可以在 FileUtile 或 File 中设置吗?有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您在写入文件时不指定编码,对于初学者来说;第二,你用什么程序读取 CSV?
  • @fge 我正在使用 Microsoft Excel 2010 打开 csv。
  • @fge。当我用记事本++打开它时,我确实得到了正确的字符。所以我认为它与系统编码有关。感谢您的建议。
  • 不,不是。看我的回答。

标签: java character-encoding fileutils apache-commons-io


【解决方案1】:

首先检查您使用的文本查看器是否能正确显示您的输出。如果不是,则问题可能出在您的系统编码上。

FileUtils.write(file, string) 使用默认系统编码,在您的系统中似乎是 8 位。然而,“ö”字符被编码为两个字节,导致“ö.”。

改用FileUtils.write(File file, CharSequence data, String encoding),并使用适当的编码:

  • ISO 8859-1(8 位标准,Latin-1)
  • CP1252(8 位专有,Windows 默认,扩展拉丁语 1)
  • MacRoman(8 位专有,Apple 默认)
  • UTF-8(16 位标准,Linux 默认)
  • Latin-15(并非始终支持)

我的建议是使用FileUtils.write(file, string, "UTF-8")

【讨论】:

  • 当我用 notepad++ 打开它时,我确实得到了正确的字符。所以我认为它与系统编码有关。感谢您的建议。
【解决方案2】:

写入文件时不指定编码。

结果是使用了默认编码。

不过,您似乎使用的是 UTF-8,不幸的是,您使用的是 Excel。

而且 Excel 无法读取 UTF-8,除非您在文件前添加 BOM...其他程序不需要。

所以,你有两个选择:

  • 继续做你正在做的事,然后用 Excel 去地狱;
  • 在文件中添加 BOM,使其他程序无法读取该文件!

另外,如果您使用的是 Java 7+,请改用Files.write()

另一种解决方案当然是使用 ISO 作为编码,但是……嗯,这是你的选择。

【讨论】:

  • Excel可以读取UTF-8,见stackoverflow.com/questions/6002256/…
  • @sina72 如果您不使用 BOM,则不会
  • @fge。您能帮我在此处添加 BOM 以解决此问题吗?
  • @Patan 在写你的行之前你应该写 char '\ufeff';但不要忘记将字符编码设置为 UTF-8。
  • @Patan 这是一个艰难的决定;真的,在 2014 年,你应该到处使用 UTF-8,但 MS Office 基本上阻止了这里的进展;这真的取决于你的用例!
猜你喜欢
  • 1970-01-01
  • 2019-10-02
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多