encodeURIComponent(url) 函數
定義和用法:
encodeURIComponent() 函數可把字符串作為 URI 組件進行編碼。
語法:
encodeURIComponent(URIstring)
參數 描述:
URIstring 必需。一個字符串,含有 URI 組件或其他要編碼的文本。
返回值:
URIstring 的副本,其中的某些字符將被十六進制的轉義序列進行替換。
說明:
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。
其他字符(比如 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進制的轉義序列替換的。
decodeURIComponent(url) 函數
定義和用法:
decodeURIComponent() 函數可把字符串作為 URI 組件進行解碼。
語法:
decodeURIComponent(URIstring)
參數 描述:
URIstring 必需。一個字符串,含有 URI 組件或其他要解碼的文本。
返回值:
URIstring 的副本,其中的某些字符被十六進制的轉義序列轉換成對應的ACSII字符。
今天在使用js的jQuery的post向后台servlet傳遞拼接的字符串數據時,一些特殊的字符例如:“+、@、#、$、%、&、?、/”等無法傳遞到后台輸出。
舉個例子:
var str1="a+aa+bb@kk$dd";
var data="data1"="+str1+"+"&"+"data2"+str2;
如果不進行編碼,則通過js的jQuery的post或者使用window.self.location傳遞數據到后台,都會造成+、@、$字符無法正常輸出。
正確寫法:
var str1=encodeURIComponent("a+aa+bb@kk$dd");
var data="data1"="+str1+"+"&"+"data2"+str2;
對於使用window.self.location傳遞數據到后台時,有一個特殊情況,就是java中的解碼方式:JavaScript用encodeURIComponent編碼后無法再到后台解碼的問題。
目前寫法:
window.self.location="index.jsp?data="+encodeURIComponent(url);
java處理的代碼為:
searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");
咋一看覺的沒問題,一編一解的,應該可以了。但還是出現了亂碼。
原因:原來在對后台java程序里的data賦值的時候,本身已經使用了一次解碼,不過解碼的結果依然不對。所以我們可以在頁面上進行兩次編碼操作,這樣后台自動的那次就可以抵消掉一次,然后在使用data=java.net.URLDecoder.decode(data,"UTF-8");進行一次解碼就好了。
正確的代碼:
JavaScript:
window.self.location="index.jsp?data="+encodeURIComponent(encodeURIComponent(url));
java:
searchtext=java.net.URLDecoder.decode(data,"UTF-8");
另外還有一種方法是JavaScript進行一次編碼,后台java處理時換種想法就好了:
java代碼:
String s = new String(request.getParameter("data").getBytes("ISO8859-1"), "UTF-8");
最后再說一下encodeURI和encodeURIComponent的區別:
對URL編碼是常見的事,所以這兩個方法應該是實際中要特別注意的。
它們都是編碼URL,唯一區別就是編碼的字符范圍,其中:
encodeURI方法不會對下列字符編碼 ASCII字母、數字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不會對下列字符編碼 ASCII字母、數字、~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大。
實際例子來說,encodeURIComponent會把 http:// 編碼成 http%3A%2F%2F 而encodeURI卻不會。