1. 程式人生 > >網路傳輸中文亂碼問題

網路傳輸中文亂碼問題

一、解決亂碼問題,要先了解一些基礎概念: 1、字符集:在計算機底層中資料儲存的都是二進位制資料,要想獲取真正有意義的字元,就必須讓二進位制資料與每一個字元對應起來,這種對應關係就形成了一張編碼表。

      常用字符集: iso-8859-1  拉丁碼錶 latin,表示西歐語言,使用一個位元組即8位表示資料

                            GB2312  簡體中文碼錶。包含6000-7000中文和符號。用兩個位元組表示。兩個位元組都是開頭為1,都為負數。

                            GBK  目前最常用的中文碼錶,2萬的中文和符號。用兩個位元組表示資料。

                            unicode  國際標準碼,無論是什麼文字,都用兩個位元組儲存

                            UTF-8  基於unicode,一個位元組就可以儲存資料,不用兩個位元組儲存,而且這個碼錶更加的標準化,在每一個位元組頭加入了編碼資訊。

(Linux 預設使用的iso-88059-1,win32預設使用的GB2312)

2、編碼:將字元轉換成在字符集中對應的編碼

      解碼:在字符集中查找出編碼對應的字元

二、中文在網路中的傳輸過程 1、以JAVA為例,eclipse預設使用UTF-8編碼集,TOMCAT伺服器預設使用iso-8859-1編碼集,瀏覽器一般預設使用GBK編碼集。

     程式與伺服器之間以字元傳輸,伺服器與瀏覽器之間以位元組傳輸。

2、中文傳輸過程:瀏覽器中的中文字元----->進行編碼----->伺服器----->進行解碼----->程式;

                                程式中的中文字元----->伺服器----->進行解碼----->瀏覽器----->編碼進行顯示

3、亂碼產生原因以解決方式:

(1)、瀏覽器中的中文字元以GBK進行編碼,以位元組流傳輸到伺服器,伺服器再以iso-8859-1進行解碼,以字元的形式傳輸給程式。

因為iso-8859-1編碼集不支援中文字元,所有解碼後的字元都是西歐字元,把這些字元傳輸給程式就產生了亂碼;

針對這個原因,只要把伺服器的編碼集設定為utf-8即可:

request.setCharacterEncoding("utf-8") ;

但這種方法只能用於POST請求方式,因為設定只會作用於請求體中的內容,如果是GET請求方式,可用先解碼再編碼的方式:

byte[] buffer = request.getParameter("word").getBytes("ISO-8859-1");  //進行編碼

String newStr = new String(buffer,"UTF-8");  //進行解碼

(2)、程式中的中文字元原樣傳輸到伺服器,伺服器要先對中文字元進行編碼再傳輸給瀏覽器,但因為iso-8859-1編碼集不支援中文字元,所以在字符集中查詢不到對應的編碼,編碼後就變成了問號,傳輸給了瀏覽器並顯示;

針對這種情況,要進行兩次設定:       

response.setCharacterEncoding("UTF-8");      //將伺服器編碼集設定為UTF-8 response.setContentType("text/html;charset=UTF-8");     //將瀏覽器編碼集設定為UTF-8

實際上第二行設定已經包含了對伺服器的設定,所以通常只要寫第二句程式碼即可