如下文章複製自http://blog.sina.com.cn/s/blog_7a3510120100xt5b.htmlhtml
1.要解決中文亂碼問題,首先得了解什麼是字符編碼數組
計算機要處理各類字符,就須要將字符和二進制內碼對應起來,這種對應關係就是字符編碼。要制定字符編碼首先要肯定字符集,並將服務器
字符集內的字符排序,而後和二進制數字對應起來,根據字符集內字符的多少,肯定幾個字節來編碼。網絡
2.經常使用的字符編碼編碼
ASCII 編碼是目前計算機中經常使用的最普遍地 字符集及其編碼。ISO-8859-1能夠表示的是西歐語言,看起來很單一,可是因爲是單字節編碼,與計算機最基礎的表示單位一致,因此在不少時候,仍舊 使用ISO-8859-1編碼來表示,並且在不少協議上默認使用這種編碼。Unicode編碼(統一碼),一般所說的UTF-8就是Unicode編碼的 實現方式。GB2312字集是簡體字集;BIG5字集是臺灣繁體字集;GBK字集是簡繁字集;GB18030 是國家制定的一個強制性大字集標準;Linux系統默認的使用的是ISO-8859-1編碼,。如今的PC平臺必須支持GB18030,對嵌入式產品暫不 做要求。因此手機、MP3通常只支持GB2312。
3.網絡傳輸產生中文亂碼緣由code
網絡通訊中,產生亂碼的緣由主要是通訊過程當中使用了不一樣的編碼方式:服務器中的編碼方式,傳輸過程當中的編碼方式,傳輸到達終端設備的編碼方式。所以在傳輸 過程當中就須要至少兩次編碼轉換:首先從服務器編碼轉爲網絡編碼,再從網絡編碼轉爲終端設備編碼。在轉換的過程當中出現任何狀況均可能出現編碼混亂。orm
4.處理中文亂碼問題經常使用三種方式解決htm
(1)因爲大部分終端設備都支持Unicode字符集,因此在鏈接網頁時,咱們但願網頁數據在網絡傳輸時使用UTF-8方式傳輸,咱們就能夠將UTF-8 轉化爲Unicode字符集。下面咱們將通訊過程當中獲得的流轉化爲字節,而後再將字節按GB2312 的方式進行轉換獲得字符串。blog
InputStream is = conn.getInputStream();排序
BufferedInputStream bis = new BufferedInputStream(is);
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");//網絡中以字節想形式默認爲UTF-8進行編碼,以GB2312顯示到終端
經過上面的轉換,「resultData」字符串即可以顯示中文效果了。
(2)另外一種方式是書記在傳遞的過程當中使用ISO-8859-1字符集,這樣就是直接使用了ASCII編碼方式,固然在傳遞到終端設備時,須要將其數據反轉纔可以正常的顯示。下面咱們將一個字符串按ISO-8859-1字符集進行轉換爲gbk,代碼以下:
public static String formatStr(String str){
if(str==null || str.length()==0){
return "";
}
try{
return new String (str.getBytes("ISO-8859-1"),"gbk"); //先在網絡中以ISO-8859-1進行編碼,再以gbk輸出到終端
}
}
3. 第三種比較簡單
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(new InputStreamReader(is,"gb2312"));//gbk也行
這樣設置下至關於直接用默認編碼轉爲byte數組,再用指定的編碼編成字符
總結:歸根結底,解決中文亂碼只須要兩個步驟:
·使用getBytes("編碼方式");來對漢字進行重編碼,獲得它的字節數組。
·再使用new String (Bytes[],"解碼方式");來對字節數組進行相應的解碼。