1. 程式人生 > >java下輸出中文的一點研究

java下輸出中文的一點研究

網上或者大部分書上都說Java中輸出中文使用FileReader類就可以了,但是當你讀取一箇中文文件時,你會發現,除了亂碼,還是亂碼。究其原因,這其實是檔案流讀取時使用的編碼方式和檔案本身編碼方式不同,造成讀取出來檔案亂碼。還有一個細節,當你使用read()直接讀取字元輸出時,無論如何都是讀不出中文的。關於這類問題,給出兩種解決方案:

一、使用BufferedReader類包裝一下FileReader類,然後使用BufferedReader::readLine()方法讀取一行的String,然後用這個String再去構造一個新的String輸出,具體如下:

FileReader f = new
FileReader("test.txt"); BufferedReader is = new BufferedReader(f); String str = null; while((str = is.readLine()) != null){ System.out.println(new String(str.getBytes("GBK","utf-8")); }

這樣就能輸出大概正確的中文了。為什麼說是大概呢?因為它可能還會有“???”或者其他一些糟心的符號。因此這種方法並不完美。另一種方法如下:

二、使用FileInputStream類讀取檔案,然後使用InputStreamReader類來封裝,最後再使用BufferdReader來讀取一行:

FileInputStream f = new FileInputStream("test.txt");
InputStreamReader is = new InputStreamReader(f,"utf-8");
BufferedReader ret = nrew BufferedReader(is);

String str = null;

while((str = ret.readLine()) != null){
System.out.println(str);
}

使用這種方法就能完美顯示中文,而沒有亂碼。但是要求中文文字使用utf-8編碼。

另外,還有一種編碼是utf-8-BOM編碼,這種編碼和utf-8不一樣,他在檔案開頭有三個位元組的識別符號,如下圖第一行:

ef bb bf 就是檔案識別符號,上圖中第一行是utf-8-BOM的“我是陳宇翔”的十六進位制編碼,第二行是utf-8的“我是陳宇翔”的十六進位制編碼。我們發現,第一行的後十五個位元組和第二行完全一樣。所以當你使用utf-8-BOM的文件,而使用utf-8方式去讀取時,輸出的第一個字元會是亂碼。同時我們還發現,utf-8編碼的中文字元是三位元組的。