原因:
編解碼不一致導致字元亂碼。
首先,我們可以透過呼叫java.nio.charset.Charset.defaultCharset()
來取得系統的預設字元集,中文Windows系統都是GBK,所以JVM預設都是以GBK字元集來進行編解碼。
相關影片學習教學:java教學影片
亂碼產生最大的可能性在於編解碼不一致。
// 代码片段1: byte[] read = "你好abc".getBytes(); String result = new String(read); System.out.println(result);
上訴這段代碼一共有3步:
#1、編碼。這裡為了看起來更簡潔就這樣寫,事實上和你從文件/網路等其他媒介讀取是一樣的,原本輸入流是什麼類型編碼,讀取後也是什麼類型編碼。這裡沒有指定編碼方式,所以預設為GBK。
2、解碼。我們最終的操作都是字串對象,可以透過指定字串的對位元組數組的解碼方式,最終獲得一個字串對象。這裡沒有指定解碼方式,所以預設為GBK。
3、輸出、使用字串。事實上這裡還有一次編解碼過程,就是輸出流編碼為GBK,控制台解碼為GBK,最終顯示。因為輸出、使用字串時都是以系統預設字元集進行,不存在編解碼不一致的可能,所以這裡不會是亂碼根源。
假設我們將輸入流的編碼改一下:
// 代码片段2: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read); System.out.println(result);
再來分析一下3步驟:
1、編碼,utf-8;
##2 、解碼,gbk。 編解碼不一致,這裡便產生了亂碼。 至於如何修復,相信已經很清楚了。修復方法如下:
// 代码片段3: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read,"utf-8"); System.out.println(result);
小結:
1、我們一般比較難控制輸入流是什麼編碼,所以注意解碼時與輸入流的編碼類型一致即可。我們一般在呼叫輸入流的相關方法看到有charset參數,就是指解碼方式。 2、輸出流同樣可以操作其編碼方式,如果後續會以輸入流操作這個輸出的結果,比如說文件,只要都以預設的方式進行,便不會產生亂碼。我們一般在呼叫輸出流的相關方法看到有charset參數,就是指編碼方式。 推薦相關文章教學:以上是java中的字元出現亂碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!