大概是這樣:
windows系統預設編碼為GBK,
如果你的eclipse工作空間編碼設為:UTF-8。
如果檔案中有中文則會亂碼。
先在N盤下建立一個test.txt檔案,裡面寫入一下内容,儲存。
然後通過FileReader擷取test.txt的字元流,然後用BufferrReader讀取字元輸入流中的文本,并列印到控制台。
public static void main(String[] args) throws Exception {
String str;
FileReader file = new FileReader("n:/test.txt");
BufferedReader reader = new BufferedReader(file);
while((str=reader.readLine())!=null) {
System.out.println(str);
}
file.close();
reader.close();
}
列印結果如下:
出現亂碼。這是因為Windows系統的檔案以GBK的方式編碼,然後FileReader以工作空間預設的UTF-8方式解碼。是以才會出現亂碼。
相當于:
byte[] by = "好好學習,天天向上。".getBytes("gbk");
String str3 = new String(by,"utf-8");
System.out.println(str3);
如果以一下用new String(str.getBytes(“utf-8”),“gbk”),"utf-8"來還原編碼,"gbk"再重新解碼,看起來沒啥問題:但是通過實驗來看還是有問題的。
public static void main(String[] args) throws Exception {
String str;
FileReader file = new FileReader("n:/test.txt");
BufferedReader reader = new BufferedReader(file);
while((str=reader.readLine())!=null) {
str=new String(str.getBytes("utf-8"),"gbk");
System.out.println(str);
}
file.close();
reader.close();
}
結果如下:
這和我們想要的結果不一樣,說明用"utf-8"編碼回去的過程中出現了錯誤,是以再用"GBK"解碼就會得到不正确的結果。
相當于:
byte[] by = "好好學習,天天向上。".getBytes("gbk");
String str3 = new String(by,"utf-8");
str3 = new String(str3.getBytes("utf-8"),"gbk");
System.out.println(str3);
根據我現在的知識,解決方法有以下兩種:
1:把你的工作空間編碼方式改為"GBK"。
2:用InputStreamReader代替FileReader
代碼如下:
public static void main(String[] args) throws Exception {
String str;
InputStreamReader file = new InputStreamReader(new FileInputStream("n:/test.txt"),"GBk");
//FileReader file = new FileReader("n:/test.txt");
BufferedReader reader = new BufferedReader(file);
while((str=reader.readLine())!=null) {
//str=new String(str.getBytes("utf-8"),"gbk");
System.out.println(str);
}
file.close();
reader.close();
}
通過以上代碼我們指明了以"GBK"的方式解碼,這樣它就不會用工作空間預設的解碼方式解碼了,運作結果如下:
這和我們想要的結果一樣,OK,問題解決,還有什麼解決的方法就得自己慢慢了解了。