天天看點

URL傳參帶特殊字元,js中對中文編碼解碼 URL編碼與兩次encodeURI

URL傳參帶特殊字元,js中對中文編碼解碼

URL傳參帶特殊字元,js中對中文編碼解碼 

有些符号在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符号,那麼就要使用他們的編碼了。編碼的格式為:%加字元的ASCII碼,即一個百分号%,後面跟對應字元的ASCII(16進制)碼值。例如 空格的編碼值是"%20"。 

如果不使用轉義字元,這些編碼就會當URL中定義的特殊字元處理。 

下表中列出了一些URL特殊符号及編碼 十六進制值 

1.+ URL 中+号表示空格 %2B 

2.空格 URL中的空格可以用+号或者編碼 %20 

3./ 分隔目錄和子目錄 %2F 

4.? 分隔實際的 URL 和參數 %3F 

5.% 指定特殊字元 %25 

6.# 表示書簽 %23 

7.& URL 中指定的參數間的分隔符 %26 

8.= URL 中指定參數的值 %3D 

function URLencode(sStr){ 

     return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F').replace(/\#/g,'%23'); 

   } 

在通過url傳參時,有些特殊字元在jsp頁面間傳遞時變成了%+ASCII碼,是以在傳遞前對其進行編碼,接收後再轉碼就OK了 

通過encodeURI()方法編碼,再通過decodeURI()轉碼即可

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解碼,編碼和解碼的過程是對稱的,是以不會出現亂碼。