【问题标题】:UTF-8 encoding in InputStreamReaderInputStreamReader 中的 UTF-8 编码
【发布时间】:2014-06-18 07:45:35
【问题描述】:

我正在使用 openCSV 生成 CSV 文件OutputStreamWriter 将该文件附加到 http 响应

这里最大的问题是,例如下载的 CSV 文件中的 '€''‚¬'。显然编码是错误的,但我已将其设置为 'UTF-8'。此外,我将 pom.xml 中的编码设置为“UTF-8”。

response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv");
response.setContentType(BulkListExportConstants.CSV_CONTENT_TYPE);
OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream(), "UTF-8");

List<String[]> result = iSmsExportService.csvExport(columnNames);
CSVWriter csvWriter = new CSVWriter(osw, BulkListSharedConstants.CSV_SEPARATOR);
csvWriter.writeAll(result);
csvWriter.flush();
csvWriter.close();
osw.flush();
osw.close();

有什么建议吗?

【问题讨论】:

  • 首先找出哪里出了问题:是通过线路发送的文件是正确的,接收者解释错误还是发送者已经发送了错误的东西?
  • 您正在正确编码文档;您将其误读为 ISO-8859-1。
  • 如果您通过任何 microsoft 产品(例如 excel)阅读文档,您需要在文件的第一个字节上设置 BOM(在 EF BB BF 之前)。
  • 我添加了 UTF8_BOM = "\uFEFF";到 osw,它就像一个魅力。你能在下面写一个答案吗? :)

标签: java excel csv encoding inputstreamreader


【解决方案1】:

正如 McDowell 所说,您的编码已正确完成,但如果您想从任何支持 BOM 的产品(例如 Excel)中读取此 csv,您需要将 BOM 插入文件/流的开头

所以你可以改变响应:

OutputStream os = response.getOutputStream();
os.write(239); //0xEF
os.write(187); //0xBB
os.write(191); //0xBF

// then write your data normally
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");

这会将 BOM 插入文件的开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2016-07-05
    相关资源
    最近更新 更多