Dan*_*uez 3 java csv utf-8 character-encoding opencsv
使用 OpenCSV 解析无BOM 的 UTF-8 文档会导致第一列无法读取。提供相同的文档内容作为输入,但使用BOM 以 UTF-8 编码可以正常工作。
我专门将字符集设置为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();
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例项目,可以在其中重现问题: https ://github.com/dajoropo/csv2beanSample
运行单元测试,您可以看到不带 BOM 的 UTF-8 文件如何失败,而带 BOM 的文件如何正常工作。
错误出现在第二个断言中,因为未读取第一列。结果是:
[Bean [a= null , b=第二个, c=第三]]
有什么提示吗?
如果我Bean在您的项目中打开课程并搜索“B”,那么我可以找到一个条目。如果我搜索“A”,那么我不能:)这意味着您将带有 BOM 标头的 A 复制/粘贴到Bean类中。BOM 标头不可见,但仍会被考虑在内。
如果我修复“A”,则另一个测试开始失败,但我认为您可以使用 来修复它 BOMInputStream。
检查这个问题和答案字节顺序标记搞砸了 Java 中的文件读取
这是已知问题。您可以使用 Apache Commons IOBOMInputStream来解决它。
刚刚尝试过
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
和
inputStreamReader = new InputStreamReader(new BOMInputStream(fileInputStream), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
并固定
@CsvBindByName(column = "A")
private String a;
Run Code Online (Sandbox Code Playgroud)
从“A”中排除前缀使两个测试都通过