網絡傳輸中文編碼問題

如下文章複製自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[],"解碼方式");來對字節數組進行相應的解碼。

相關文章
相關標籤/搜索