簡體   English   中英

OpenCSV CsvToBean:不帶BOM的UTF-8無法讀取第一列

[英]OpenCSV CsvToBean: First column not read for UTF-8 Without BOM

使用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的UTF-8文件如何失敗以及帶有BOM的UTF-8文件如何正常工作。

錯誤出現在第二個斷言中,因為第一列未讀。 結果:

[Bean [a = null ,b = second,c = third]]

有什么提示嗎?

如果我在您的項目中打開Bean類並搜索“ B”,那么我可以找到一個條目。 如果我搜索“ A”,那么我不能:)這意味着您將帶有BOM表頭的A復制/粘貼到Bean類。 BOM表頭不可見,但仍會考慮在內。

如果我修復“ A”,則另一個測試開始失敗,但是我認為您可以使用BOMInputStream對其進行BOMInputStream

檢查此問題並回答字節順序標記會破壞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”中排除前綴會使兩個測試均通過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM