java - OpenCSV CsvToBean : First column not read for UTF-8 Without BOM

标签 java csv utf-8 character-encoding opencsv

使用 OpenCSV 解析 不带 BOM 的 UTF-8 文档会导致第一列无法读取。提供相同的文档内容作为输入,但以 UTF-8 BOM 编码可以正常工作。

我专门将字符集设置为 UTF-8

    fileInputStream = new FileInputStream(file);
    inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
    reader = new BufferedReader(inputStreamReader);
    HeaderColumnNameMappingStrategy<Bean> ms = new HeaderColumnNameMappingStrategy<Bean>();
    ms.setType(Bean.class);
    CsvToBean<Bean> csvToBean = new CsvToBeanBuilder<Bean>(reader).withType(Bean.class).withMappingStrategy(ms)
            .withSeparator(';').build();
    csvToBean.parse();

我创建了一个示例项目,可以在其中重现问题: https://github.com/dajoropo/csv2beanSample

运行单元测试,您可以看到不带 BOM 的 UTF-8 文件如何失败,而带 BOM 的文件如何正常工作。

错误出现在第二个断言中,因为第一列未读取。结果是:

[Bean [a=null, b=第二, c=第三]]

有什么提示吗?

最佳答案

如果我在您的项目中打开 Bean 类并搜索“B”,那么我可以找到一个条目。如果我搜索“A”,那么我不能:)这意味着您将带有 BOM header 的 A 复制/粘贴到 Bean 类。 BOM header 不可见,但仍会被考虑在内。

如果我修复“A”,则另一个测试开始失败,但我认为您可以使用 BOMInputStream 修复它。

查看此问题和答案 Byte order mark screws up file reading in Java

这是已知问题。您可以使用 Apache Commons IO 的 BOMInputStream 来解决。

刚刚尝试

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

        inputStreamReader = new InputStreamReader(new BOMInputStream(fileInputStream), StandardCharsets.UTF_8);

并修复

@CsvBindByName(column = "A")
private String a;

从“A”中排除前缀使两个测试都通过

关于java - OpenCSV CsvToBean : First column not read for UTF-8 Without BOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189424/

相关文章:

javascript - 在 XHR 上传中处理非 ASCII 文件名

java - 使用 Dagger + 解析服务器 SDK : java. lang.IllegalArgumentException

java - 将数组作为查询的参数从 Java 发送到 SQL Server

运行Mapreduce程序时出现Java错误

ruby - 规范化不同格式的原始文本以在 Ruby 中创建对象

java - SOAP 负载中的特殊字符未正确传输

java - 导致应用程序崩溃的未知错误

php - 从服务器下载 CSV 文件

excel - 我可以使用 VBScript 来获取现有的 CSV 并将它们制作成单个 Excel 工作簿的选项卡吗?

java - 如何知道我的 HTTP 请求是否使用 UTF-8?