關於使用InputStreamReader讀取GBK編碼文件亂碼的問題

原文鏈接:https://mypyg.iteye.com/blog/888915

Java代碼:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath)));  

當使用此Reader讀取GBK編碼的文件時,所有的中文都會亂碼,因爲Reader會將讀取到的byte轉換成char,如果沒有指定轉換編碼,那麼默認是使用的utf8,那麼讀取到的內容就會錯誤。  

那麼假如讀取完畢後進行一次轉碼是否可以解決亂碼問題呢? 

String s = readline();  
s = new String(s.getBytes("gbk"), "gbk");  

 思路是獲得字符串的gbk編碼,按照gbk編碼重新解析一遍,實驗證明是不可以的,是什麼原因呢? 

舉例說明: 

Java代碼

byte ge[] = {(byte)0xb8, (byte)0xf6};  

這是漢字‘個’的gbk編碼。 
String s = new String(ge, "gbk"); 
此時s不會是亂碼。 

s.getBytes("utf8") //得到-28,-72,-86。‘個’的utf8編碼  
s.getBytes("gbk") //得到0xb8,0xf6。‘個’的gbk編碼  

而如果用一下代碼生成s: 

String s = new String(ge, "utf8");  

此時s已經是亂碼。 

s.getBytes("utf8") //得到-17,-65,-67,-17,-65,-67  

此時s的內容已經完全亂掉了,所以再用  s.getBytes("gbk");  得到的數據也是亂的,無法逆向出真正的內容來。 

所以要解決這個問題只能是讓reader將byte轉向char時使用正確的編碼,即生成Reader時指定編碼,即:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath), "gbk"));  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章