【问题标题】:Generate CSV via Apache CSV in UTF-8通过 UTF-8 中的 Apache CSV 生成 CSV
【发布时间】:2019-11-28 10:28:13
【问题描述】:

如何通过 Apache CSV 以 UTF-8 格式编写 CSV 文件?

我正在尝试通过以下代码生成 csv,其中 Files.newBufferedWriter() 默认将文本编码为 UTF-8,但是当我在 excel 中打开生成的文本时,会出现无意义的字符。

我这样创建 CSVPrinter:

CSVPrinter csvPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get(filePath)), CSVFormat.EXCEL);

接下来我设置标题

csvPrinter.printRecord(headers);

在循环中的下一个我将值打印到这样的写入器中

csvPrinter.printRecord("value1", "valu2", ...);

我还尝试将文件上传到在线 CSV lint 验证器,它告诉我使用的是 ASCII-8BIT 而不是 UTF-8。我做错了什么?

【问题讨论】:

  • ASCII 字符在 UTF8 中的编码方式与在 ASCII 中的编码方式相同。您的代码仅使用 ASCII 字符,因此在查看文件时无法区分 ASCII 和 UTF8。
  • 而不是CSVFormat.EXCEL 尝试使用CSVFormat.RFC4180
  • @Deadpool 没有帮助:/
  • 类似CSVPrinter printer = new CSVPrinter(new PrintWriter("nlp.csv", "UTF-8"), CSVFormat.EXCEL.withDelimiter("|".charAt(0)));@DenisStephanov
  • @Deadpool 仍然无法正常工作

标签: java csv apache-commons-csv


【解决方案1】:

Microsoft 软件倾向于采用 windows-12* 或 UTF-16LE 字符集,除非内容以 byte order mark 开头,软件将使用它来识别字符集。尝试在文件开头添加字节顺序标记:

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(filePath))) {

    writer.write('\ufeff');

    CSVPrinter csvPrinter = new CSVPrinter(writer);

    //...
}

【讨论】:

  • 这也可以作为标题 CSVFormat.EXCEL.withHeader('\ufeff' + "Name", "Age") 完成,因此我们可以将 CSVPrinter 作为 try 的一部分。
  • 这个解决方案在带有字节顺序标记的ubuntu中仍然有效吗?
  • @RezguiBahaEddinne 这适用于任何系统。 UTF-8 是通用的。但是,在 Ubuntu 中读取文件将取决于您使用的工具。以我的经验,许多编辑器足够聪明,可以识别 BOM,但文本处理工具通常不能。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2013-12-15
  • 2012-05-08
  • 1970-01-01
  • 2015-03-04
  • 2013-06-13
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多