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"));