java中的URLEncoder.encode對應JS中用decodeURIComponent,js和java編碼,解碼


用get請求傳中文,經常搞到亂碼,這幾天搞搞這個東西,總結一下,以方便以后處理這類的問題。

Java代碼中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,它會將處字母和數字,以及*字符外的都編碼成%xx形式。

JS的unescape和decodeURI都不能用來解碼JAVA中URLEncoder.encode編碼的字符串。

在JAVA代碼中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent還原成字符串。

在JAVA代碼中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")來將在JS中用encodeURIComponent的參數還原成字符串。

========================================================

1、decodeURI()定義和用法

decodeURI() 函數可對 encodeURI() 函數編碼過的URI 進行解碼。

語法:decodeURI(URIstring)

參數 描述:URIstring 必需。一個字符串,含有要解碼的 URI 或其他要解碼的文本。

返回值:URIstring 的副本,其中的十六進制轉義序列將被它們表示的字符替換。

2、encodeURI 方法

將文本字符串編碼為一個有效的統一資源標識符 (URI)。

encodeURI(URIString)
必選的 URIString 參數代表一個已編碼的 URI。

說明
encodeURI 方法返回一個編碼的 URI。如果您將編碼結果傳遞給 decodeURI,那么將返回初始的字符串。encodeURI 方法不會對下列字符進行編碼:":"、

"/"、";" 和 "?"。請使用 encodeURIComponent 方法對這些字符進行編碼。

-----------------------------------------------------------------------------------------------------------

3、decodeURIComponent()定義和用法:decodeURIComponent() 函數可對 encodeURIComponent() 函數編碼的 URI 進行解碼。

語法:decodeURIComponent(URIstring)

參數 描述:URIstring 必需。一個字符串,含有編碼 URI 組件或其他要解碼的文本。

返回值:URIstring 的副本,其中的十六進制轉義序列將被它們表示的字符替換。

4、encodeURIComponent() 方法:
把URI字符串采用UTF-8編碼格式轉化成escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串里面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之后URL將顯示錯誤。不會被此方法編碼的字符:! * ( )。

因此,對於中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要采用encodeURI或者encodeURIComponent。

========================================================

示例代碼如下:

JavaScript代碼encode

functionfindNE(){
 varnd = document.getElementById("NE").value;
 nd = encodeURIComponent(encodeURIComponent(nd));
 alert(nd);
 $.fn.zTree.destroy("netree");
 setting.async.url="common/getNeList.action?seachName="+nd;
 
 $.fn.zTree.init($("#netree"), setting);
 
 }

 

java代碼decode

String serchName = request.getParameter("seachName");
 System.out.println("serchName1::::::::::::::::::::::"+serchName);
 if(StringUtils.isNotBlank(serchName)){
 try{
 serchName = java.net.URLDecoder.decode(serchName,"UTF-8");
 }catch (UnsupportedEncodingException e) {
 e.printStackTrace();
 }
 }
 System.out.println("serchName2::::::::::::::::::::::"+serchName);
在線轉碼工具 http://tool.oschina.net/encode?type=4

escape encodeURI encodeURIComponent的使用和區別


escape(unescape),encodeURI(decodeURI)和encodeURIComponent(decodeURIComponent)都是用來編(解)碼字符以利於在網絡上傳輸和解析。


1. escape

  把特殊字符(不包括 + - * / . _ @)轉化成相應的ASCII表示法(%XX)或者Unicode表示法(%uXXXX)

 
Javascript代碼   收藏代碼
  1. document.write(escape("+-*/._@ '()陽春三月"));  


  輸出結果:
  +-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708

  從結果中可以看出,+-*/._@不會被編碼,空格轉成%20,單引號轉成%27,圓括號轉成%28和%29,四個漢字用Unicode編碼成四個%uXXXX序列。

  如果我們對escape的字符序列再次調用escape:
 
Javascript代碼   收藏代碼
  1. document.write(escape(escape("+-*/._@ '()陽春三月")));  


  輸出結果:
  +-*/._@%2520%2527%2528%2529%25u9633%25u6625%25u4E09%25u6708

  可以看出,escape會編碼已經escape過的字符%為%25

  
  調用unescape進行解碼:

 
Javascript代碼   收藏代碼
  1. document.write(unescape(escape(escape("+-*/._@ '()陽春三月"))));  


  輸出結果:
  +-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708
  

  再次調用escape進行解碼:

 
Javascript代碼   收藏代碼
  1. document.write(unescape(unescape(escape(escape("+-*/._@ '()陽春三月")))));  


  輸出結果:
  +-*/._@ '()陽春三月

  所以在編寫代碼時,要注意被操作字符序列是否已經escape或unescape過。



2. encodeURI和encodeURIComponent

  和escape類似,不同的是
  a. 它們不會對(' tilde(加在西班牙語n字上的發音符號) ())編碼:

 
Javascript代碼   收藏代碼
  1. document.write(encodeURI("+-*/._@ '()"));  


  輸出結果:
  +-*/._@%20'()

  b. 它們編碼Unicode字符也不同,輸出為:%XX%XX or %XX%XX%XX
 
Javascript代碼   收藏代碼
  1. document.write(encodeURI("陽春三月"));  


  輸出結果:
  %E9%98%B3%E6%98%A5%E4%B8%89%E6%9C%88

  encodeURI把每個中文字符都轉成了%XX%XX%XX格式



  3. encodeURI和encodeURIComponent區別:

  encodeURIComponent會編碼encodeURI不管的(, / ? : @ & = + $ #),其中,(+ / @)escape也不聞不問

 
Javascript代碼   收藏代碼
  1. document.write(encodeURI(",/?:@&=+$#"));  
  2. document.write(encodeURIComponent(",/?:@&=+$#"));  


  輸出結果:
  ,/?:@&=+$#
  %2C%2F%3F%3A%40%26%3D%2B%24%23


總結:
  escape是元老級的方法,很多瀏覽器表示都支持,適用於html字符編碼
  encodeURI和encodeURIComponent出道較晚,適用於uri字符編碼,並且后者對很多URI中可能出現的特殊字符都進行編碼


免責聲明!

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



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