使用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();
我创建了一个示例项目,可以在其中重现该问题: https://github.com/dajoropo/csv2beanSample
运行单元测试,您可以看到没有BOM且带有BOM的UTF-8文件如何失败。
该错误来自第二个断言,因为第一列未读。结果:
[Bean [a = null ,b = second,c = third]]
有任何提示吗?
答案 0 :(得分:1)
如果我在您的项目中打开Bean
类并搜索“ B”,那么我可以找到一个条目。如果我搜索“ A”,那么我不能:)这意味着您将带有BOM表头的A复制/粘贴到Bean
类中。 BOM表头不可见,但仍会考虑在内。
如果我修复“ 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”中排除前缀会使两个测试均通过