java下輸出中文的一點研究
阿新 • • 發佈:2018-11-16
網上或者大部分書上都說Java中輸出中文使用FileReader類就可以了,但是當你讀取一箇中文文件時,你會發現,除了亂碼,還是亂碼。究其原因,這其實是檔案流讀取時使用的編碼方式和檔案本身編碼方式不同,造成讀取出來檔案亂碼。還有一個細節,當你使用read()直接讀取字元輸出時,無論如何都是讀不出中文的。關於這類問題,給出兩種解決方案:
一、使用BufferedReader類包裝一下FileReader類,然後使用BufferedReader::readLine()方法讀取一行的String,然後用這個String再去構造一個新的String輸出,具體如下:
FileReader f = newFileReader("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編碼的中文字元是三位元組的。