要想解決Java中文亂碼問題,首先要了解字符,字符集,編碼的概念以及經常使用的編碼方式。數組
字符:是文字與符號的總稱,包括文字,圖形符號,數學符號等。服務器
字符集:就是一組抽象字符的集合。字符集經常和一種具體的語言文字對應起來,該文字中的全部字符或者大部分經常使用字符就構成了該文字的字符集,好比英文字符集,繁體字符集,日文字符集等。網絡
字符編碼:計算機要處理各類字符,就須要將字符和二進制內碼對應起來,這種對應關係就是字符編碼。要制定編碼首先要肯定字符集,並將字符集內的字符排序,而後和二進制數字對應起來。根據字符集內字符的多少,肯定用幾個字節來編碼。編碼
ASCII編碼是目前計算機中用得最普遍的字符集及其編碼。ISO-8859-1能夠表示的是西歐語言,它看起來很簡單,爲是麼還在使用呢?因爲是單字節編碼,與計算機最基礎的表示單位一致,因此不少時候,仍舊使用ISO-8859-1編碼來表示,並且在不少協議上默認使用該編碼。Unicode編碼(統一碼,萬國碼,單一碼)是一種在計算機上使用的字符編碼,一般咱們所遇到的UTF-8就是Unicode編碼的實現方式。Gb2312子集是簡體字集;Big5字集是臺灣繁體字集;GBK字集是簡繁字集,包括了Gb字集,Big5字集和一些符號。Gb18030是國家制定的一個強制性大字集標準,它的推出使漢字集有了統一的標準。Linux系統默認使用的是ISO-8859-1編碼,Win32系統默認使用的是Gb2312編碼。code
網絡通訊中,產生亂碼的緣由是主要是通訊過程當中使用了不一樣的編碼方式:服務器中的編碼方式,傳輸過程當中的編碼方式,傳輸到達終端設備的編碼方式。所以在傳輸過程當中就須要至少兩次編碼轉換:首先從服務器編碼轉換爲網絡編碼,再從網絡編碼轉換爲終端設備編碼。在轉換過程當中發生任何狀況均可能引發編碼混亂,通常狀況下咱們能夠經過如下兩種方式來避免這個問題。orm
一種方式是:因爲大部分終端設備都支持Unicode字符集,因此在鏈接網頁時,咱們但願網頁數據在網絡傳輸時使用UTF-8方式傳輸,這樣就能夠很簡單地將UTF-8轉換成Unicode字符集了,下面咱們將通訊過程當中獲得的流先轉換爲字節,而後再將字節按Gb2312的方式進行轉換獲得字符串,代碼以下排序
InputStream is = conn.getInputStream();字符串
BufferedInputStream bis = new BufferedInputStream(is);get
byte bytearray[] = new byte[1024];數學
int current = -1;
int i = 0;
while((current = bis.read()) != -1){
bytearray[i] = (byte)current;
i++;
}
resultData = new String(bytearray, "GB2312");
所以,經過上面的轉換,「resultData」字符串即可以顯示中文效果了。
另外一種方式是在數據傳遞過程當中使用ISO-8859-1字符集,這樣就是直接使用ASCII編碼方式,固然在傳遞到終端設備時,須要將其數據反轉纔可以正常顯示。下面咱們將一個字符串按ISO-8859-1字符集進行轉換,代碼以下:
public static String FormatStr(String str){
if(str == null || str.length() == 0){
return "";
}
try{
return new String(str.getBytes("ISO-8859-1"), "bgk");
}catch(UnsupportedEncodingException ex){
return str;
}
}
歸根結底,解決中文亂碼只須要兩個步驟:
使用getBytes("編碼方式");來對漢字進行重編碼,獲得它的字節數組。
在使用new String(Bytes[], "編碼方式");來對字節數組進行相應的解碼。
只要理解了編碼和解碼的含義,並掌握了何時應該編碼,何時應該解碼,怎麼編碼及怎麼解碼,就再也不懼怕中文亂碼問題了。