關於UTF8文件帶BOM頭可能會引起的錯誤解析


  今天在做一個文件上傳的項目中碰到了一個十分奇怪的問題,在解析上傳上來的csv文件時,總是在解析第一行的第一個標題字段時出錯,就是第一個那個字段總是和對應的model字段對應不上,這個坑是真的很深,找了半天,發現原來utf8編碼格式的文件可能會有BOM頭這玩意兒!

   我們先來看看什么是BOM頭:

                                         在utf-8編碼文件中BOM在文件頭部,占用三個字節,用來標示該文件屬於utf-8編碼。

  現在已經有很多軟件識別bom頭,但是還有些不能識別bom頭,比如PHP就不能識別bom頭,這也是用記事本編輯utf-8編碼后執行就會出錯的原因了。

  最坑的是這個bom頭在記事本中是完全看不見的,當記事本指定的編碼格式是默認的ANSI編碼時,文件的內容解析是沒有任何問題的。但是,這樣會出現中文亂碼的情況,一般在項目中都會統一使用utf8編碼,在我在記事本中指定了utf8編碼格式上傳后,才出現了字段解析不正確的情況。

  那么怎么處理掉這個BOM頭呢,在java中apache提供了一個工具類BOMStream,在獲取文件流時,將獲取到的文件流轉化成為BOM流:

 1 InputStreamReader isr = new InputStreamReader (new BOMInputStream (fileInputStream), "utf8");  

這樣以來,讀取的文件中即使有BOM頭,也會被自動過濾掉。但是這種方法只能過濾掉UTF-8/UTF-16LE/UTF-16BE三種編碼格式的文件,當文件是其他格式時,就會失效。

要想支持更多的編碼格式的文件,只能使用另外一個工具了:UnicodeStream和UnicodeReader,其使用示例如下:

1 FileInputStream fis = new FileInputStream(file);  
2 UnicodeReader ur = new UnicodeReader(fis, "utf-8");  
3 BufferedReader br = new BufferedReader(ur);  

這種方式更加的通用與強大。推薦使用這種方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM