1. 程式人生 > >解決中文亂麻問題,頁面端發出的資料作兩次encodeURI

解決中文亂麻問題,頁面端發出的資料作兩次encodeURI

前端URL裡面有中文的時候就要在js裡面進行兩次編碼了

encodeURI(encodeURI(URL));

後臺解碼:

 URLDecoder.decode(name,"UTF-8");

URL編碼與兩次encodeURI

當使用位址列提交查詢引數時,如果不編碼,非英文字元會按照作業系統的字符集進行編碼提交到伺服器,伺服器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。

encodeURI函式採用UTF-8對URL進行編碼,所以如果伺服器在進行解碼時使用的是其他的編碼方式就會出現亂碼,預設的伺服器配置的解碼字符集都不是UTF-8,所以大部分情況下位址列提交中文查詢引數時會產生亂碼;針對這種情況,可以連續使用兩次encodeURI在客戶端(主要指瀏覽器)對非英文字元進行編碼,然後在服務端使用java.net.URLDecoder(String."UTF-8")解碼,即可得到正確的中文。

如果只進行一次encodeURI,得到的是UTF-8形式的URL,伺服器端通過request.getParameter()解碼查詢引數(通常是iso-8859-1)就會得到亂碼。

如果進行兩次encodeURI,第一次編碼得到的是UTF-8形式的URL,第二次編碼得到的依然是UTF-8形式的URL,但是在效果上相當於首先進行了一次UTF-8編碼(此時已經全部轉換為ASCII字元),再進行了一次iso-8859-1編碼,因為對英文字元來說UTF-8編碼和ISO-8859-1編碼的效果相同。在伺服器端,首先通過request.getParameter()自動進行第一次解碼(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,對結果無影響)得到ascii字元,然後再使用UTF-8進行第二次解碼,通常使用java.net.URLDecoder("","UTF-8")方法。

兩次編碼兩次解碼的過程為:

UTF-8編碼->UTF-8(iso-8859-1)編碼->iso-8859-1解碼->UTF-8解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。

encodeURL函式主要是來對URI來做轉碼,它預設是採用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個位元組構成,每一個位元組會轉換成16進位制的編碼,同時新增上%號.

假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼

1.第一次encodeURI,按照utf-8方式獲取位元組陣列變成[-28,-72-83],對位元組碼陣列進行遍歷,把每個位元組轉化成對應的16進位制數,這樣就變成了[E4,B8,AD],最後變成[�,�,�]  此時已經沒有了多位元組字元,全部是單位元組字元。

2、第二次encodeURI,進行編碼,會把%看成一個轉義字元,並不編碼%以後字元,會把%編碼成%.把陣列最後變成[�,�,�]然後就把處理後的資料[�,�,�]發往伺服器端,
當應用伺服器呼叫getParameter方法,getParameter方法會去向應用伺服器請求引數
應用伺服器最初獲得的就是傳送來的[�,�,�],應用伺服器會對這個資料進行URLdecode操作,應用伺服器進行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[�,�,�],因為都會把%解析成%.並把這個值返回給getParameter方法

3、再用UTF-8解碼一次,就得到"中"了。

想想看,如果不編碼兩次,當伺服器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現亂碼。