【问题标题】:CSV Java Generated Files Are Opened With Incorrect CharsetCSV Java 生成的文件以不正确的字符集打开
【发布时间】:2016-11-21 04:41:27
【问题描述】:

以下是用于生成 CSV 文件的 java 代码。尽管在调试此report.getEncoding() 时获取了“UTF-8”的值,但生成的文件使用了不正确的字符集。

public void generateFile(ReportBean<T> report, String filename, ReportAggregationPosition reportAggregationPosition) throws IOException {
    try (PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filename), report.getEncoding()))) {
        List<T> filteredResult = new ArrayList();
        for (T row : report.getResult()) {
            if (logRow(row)) {
                log.info("Logging row for report={} - {}", filename, getText(row));
            }
            if (ignoreRow(row)) {
                log.info("Ignoring row for report={} - {}", filename, getText(row));
                continue;
            }
            filteredResult.add(row);
        }
        if (reportAggregationPosition == ReportAggregationPosition.FIRST) {
            out.println(filteredResult.size());
        }
        out.print(getHeader());
        if (reportAggregationPosition == ReportAggregationPosition.SECOND) {
            out.println(filteredResult.size());
        }
        for (T row : filteredResult) {
            out.print(getText(row));
        }
        if (reportAggregationPosition == ReportAggregationPosition.LAST) {
            out.println(String.format("Total number of rows: %s", filteredResult.size()));
        }
    }

期望值为:

test-vfde - 隐藏版 - Gebühr pro Benutzer Leistungszeit 07/07/16 bis 08/05/16

但显示的值(我无法上传照片,因为我还没有学分)是以下值:

test-vfde - 隐藏版 - GebÇŸ'?Ç?¶¬hr pro Benutzer Leistungszeit 07/07/16 bis 08/05/16

“ä”或“ü”字符显示正确。我应该如何处理?

【问题讨论】:

  • “显示的值”显示在哪里?
  • 你确定作者有错误的字符集,而不是你打开它的读者吗?
  • 安德烈亚斯。我仍然无法上传 CSV 文件,但在主题所述的 CSV 文件中。
  • ManuToMatic。我正在调试,UTF8 是用于生成文件的字符集...虽然当客户端使用 Microsoft Excel 或 NotePad++ 时,显示的值不正确...例如,它显示的不是“ü”而是“ÇŸ”
  • 使用 UTF-8,我确实在 NotePadd++ 中获得了正确的值。如果你发了minimal reproducible example 会有所帮助。

标签: java csv utf-8


【解决方案1】:

尝试添加以下行

.....
try (PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filename), report.getEncoding()))) {
    out.write(0xef);
    out.write(0xbb);
    out.write(0xbf);
    List<T> filteredResult = new ArrayList();
    .....

说明可以在here找到

【讨论】:

  • 宇佐地。谢谢你的回答。我意识到在应用程序的许多部分中,在编写内容之前应用了相同的代码......这里的问题是我无法重现它,所以我必须考虑以一种测试方式而不是在本地进行测试。 ..我会让你更新我的朋友...干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2013-11-05
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多