1. 程式人生 > >本地文件讀取(csv,txt)時字符編碼問題解決

本地文件讀取(csv,txt)時字符編碼問題解決

red eve utf-8 中文字符 有著 生產 light 用戶 讀取

  今天進行csv文件讀取時,老是入庫為空,因為其中有中文字符,我要通過中文字符映射成相應的編號(上升:1011,下降:1012),於是怎麽也取不到編號.剛開始以為程序映射出了問題,最後日誌打出來後,發現讀取的csv文件內容中文全為亂碼.啊啊啊,好坑.於是看了下別人寫的讀取csv文件的代碼,果然是沒有設置字符編碼.通過字符讀取文件,轉為字節流一定要進行字符編碼設置,否則跑到測試環境或生產環境會使用本地默認字符集,那就坑大了.

  問題代碼:

BufferedReader in = new BufferedReader(new FileReader(this.inputCsvFile));

  解決方式:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(this.inputCsvFile), "UTF-8"));

就這兩行不同的代碼卻有著不同的效果,神奇吧.

接下來我就說一說原理,我覺得人家說的挺好,於是就引用人家說的.

Java的I/O類處理如圖:

Reader 類是 Java 的 I/O 中讀字符的父類,而 InputStream 類是讀字節的父類,InputStreamReader 類就是關聯字節到字符的橋梁,它負責在 I/O 過程中處理讀取字節到字符的轉換,而具體字節到字符的解碼實現它由 StreamDecoder 去實現,在 StreamDecoder 解碼過程中必須由用戶指定 Charset 編碼格式。值得註意的是如果你沒有指定 Charset,將使用本地環境中的默認字符集,例如在中文環境中將使用 GBK 編碼。

技術分享

Java的I/O類處理圖

總結:Java讀取數據流的時候,一定要指定數據流的編碼方式,否則將使用本地環境中的默認字符集。

引用:

https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

http://sd8089730.iteye.com/blog/1290895

http://blog.csdn.net/greenqingqingws/article/details/7395213

 

本地文件讀取(csv,txt)時字符編碼問題解決