JSP頁面編碼,Java后台解碼問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM