OpenCSV CsvToBean:没有 BOM 的 UTF-8 未读取第一列
OpenCSV CsvToBean: First column not read for UTF-8 Without BOM
使用 OpenCSV 解析 UTF-8 文档没有 BOM 导致未读取第一列。将相同的文档内容作为输入,但以 UTF-8 with 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=second, c=third]]
有什么提示吗?
如果我在你的项目中打开 Bean
class 并搜索 "B" 那么我可以找到一个条目。如果我搜索 "A" 那么我不能 :) 这意味着你 copy/pasted A 的 BOM header 到 Bean
class。 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" 中排除前缀使两个测试都通过
使用 OpenCSV 解析 UTF-8 文档没有 BOM 导致未读取第一列。将相同的文档内容作为输入,但以 UTF-8 with 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=second, c=third]]
有什么提示吗?
如果我在你的项目中打开 Bean
class 并搜索 "B" 那么我可以找到一个条目。如果我搜索 "A" 那么我不能 :) 这意味着你 copy/pasted A 的 BOM header 到 Bean
class。 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" 中排除前缀使两个测试都通过