JSP頁面編碼,Java後臺解碼問題

encodeURIComponent(url) 函數

定義和用法:java

      encodeURIComponent() 函數可把字符串做爲 URI 組件進行編碼。jsp

語法:
      encodeURIComponent(URIstring)函數

參數 描述:post

      URIstring 必需。一個字符串,含有 URI 組件或其餘要編碼的文本。編碼

返回值:url

      URIstring 的副本,其中的某些字符將被十六進制的轉義序列進行替換。spa

說明:.net

      該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。code

      其餘字符(好比 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進制的轉義序列替換的。ip

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卻不會。

相關文章
相關標籤/搜索