定義和用法:java
encodeURIComponent() 函數可把字符串做爲 URI 組件進行編碼。jsp
語法:
encodeURIComponent(URIstring)函數
參數 描述:post
URIstring 必需。一個字符串,含有 URI 組件或其餘要編碼的文本。編碼
返回值:url
URIstring 的副本,其中的某些字符將被十六進制的轉義序列進行替換。spa
說明:.net
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。code
其餘字符(好比 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進制的轉義序列替換的。ip
定義和用法:
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");
對URL編碼是常見的事,因此這兩個方法應該是實際中要特別注意的。
它們都是編碼URL,惟一區別就是編碼的字符範圍,其中:
encodeURI方法不會對下列字符編碼 ASCII字母、數字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不會對下列字符編碼 ASCII字母、數字、~!*()'
因此encodeURIComponent比encodeURI編碼的範圍更大。
實際例子來講,encodeURIComponent會把 http:// 編碼成 http%3A%2F%2F 而encodeURI卻不會。