一、PrintWriter介紹
PrintWriter是Java IO庫中提供的一個輸出流,可以將數據寫入到文件、控制台或者網路連接等目標中。PrintWriter同時提供了很多重載函數,可以列印各種不同類型的數據。
二、PrintWriter中文亂碼問題原因
PrintWriter的write方法是單字元輸出,而println等方法是字元串輸出,在寫入中文字元時,由於中文字元佔用的位元組數不同(一個或兩個位元組),而PrintWriter默認採用系統默認的編碼方式(一般為UTF-8),如果寫入的字符集和PrintWriter默認的字符集不一致,就會出現亂碼現象。
比如以下代碼:
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "GBK")); writer.println("中國"); writer.flush(); writer.close();
可以看出,輸出流的字符集被設置為GBK,而字元串「中國」默認是UTF-8編碼,寫入時就會出現亂碼。
三、PrintWriter中文亂碼解決方法
1、通過設置OutputStreamWriter字符集
可以通過向PrintWriter的構造函數傳遞一個OutputStreamWriter對象,來設置輸出流的字符集。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "GBK"));
這樣就可以將輸出流的字符集設置為GBK,就能夠正常輸出「中國」字元串了。
2、通過設置PrintWriter的編碼方式
除了通過設置OutputStreamWriter字符集來解決中文亂碼問題,還可以使用PrintWriter的構造函數,直接設置字符集。
PrintWriter writer = new PrintWriter(outputStream, true, "GBK");
第三個參數「GBK」就是設置輸出流字符集的操作,這樣在後續輸出中,PrintWriter就可以正確列印中文字元了。
3、使用PrintStream代替PrintWriter
PrintStream是Java IO庫中提供的另外一個輸出流,可以將數據寫入到文件、控制台或者網路連接等目標中。
和PrintWriter不同的是,PrintStream在輸出時會將字元串轉換為位元組數組,而且默認情況下使用的是ISO-8859-1編碼,不會出現中文亂碼問題。
PrintStream printStream = new PrintStream(outputStream); printStream.println("中國"); printStream.flush(); printStream.close();
這樣就可以輸出中文字元了。
四、總結
在使用PrintWriter輸出中文字元時,需要注意設置輸出流的字符集或者PrintWriter的編碼方式,否則就會出現中文亂碼問題。另外,如果不需要使用PrintWriter的高級功能,可以使用PrintStream來輸出字元,這樣可以避免中文亂碼問題。
原創文章,作者:OJBDI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330089.html