1. 程式人生 > >中文亂碼 encodeURI來解決URL傳遞時的中文問題

中文亂碼 encodeURI來解決URL傳遞時的中文問題

影響 文字 ring class detail pla 解碼 http 效果

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

var name="張三";

encodeURI(encodeURI(name));

後臺解碼:

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

參考:http://blog.csdn.net/zqd_java/article/details/53608585

------------------------------------------------------------------------------------------------------------------

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編碼的東西,就是會出現亂碼。

中文亂碼 encodeURI來解決URL傳遞時的中文問題