URI 中特殊字符處理



一、問題闡述

  今天寫 url 請求時,不管是get 請求還是 post 請求,如果參數中帶有 + % # 等特殊符號,就無法正常獲得參數

  具體現象就是 用URL傳參數的時候,用&符號連接,如果某一個參數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面getParameter就會取不到傳過來的參數。

二、解決方法

  有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了

  1)下面列出了一些URL特殊符號及編碼十六進制值

  • +    URL 中+號表示空格             %2B 
  • 空格 URL中的空格可以用+號或者編碼 %20 
  •  /    分隔目錄和子目錄  %2F   
  • ?     分隔實際的 URL 和參數 %3F 
  • %   指定特殊字符 %25 
  • #    表示書簽 %23 
  • &    URL 中指定的參數間的分隔符 %26 
  • =    URL 中指定參數的值 %3D

 

   2)java 實現

    如果代碼采用java 來訪問請求的話,可以采用 URLEncoder.encode(param,"utf-8") 將參數值編碼,對應的解碼方法為URLEncoder.decode()

    java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s); 

    比如     

String str = "http://localhost:8980/select?param=" + URLEncoder.encode("bcpuser$userid$1#3#4","utf-8") ; 
//得到結果 http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

    得到url 可以直接在瀏覽器上訪問,如果后台采用的java+ springMVC,可以直接得到預期的參數(無需再次解碼的)

 

  3)C# 實現

  C#中編碼的主要方法:HttpUtility.UrlEncode (不推薦)、Server.UrlEncode (不推薦)、Uri.EscapeUriString、Uri.EscapeDataString。(更多詳情,看參考)

String str = "http://localhost:8980/select?param=" + Uri.EscapeDataString("bcpuser$userid$1#3#4"); 
//得到結果  http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

  

  4) javascript 實現方法

  javascript中的編碼有三種方法:escape (不推薦,對ASCII符號正確編碼)、encodeURI、encodeURIComponent

  encodeURI:用於對網址編碼(不包含參數)

    encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

    encodeURI就是為這個而設計的。encodeURI不對URI中的特殊字符進行編碼,如冒號(:)、斜杠(/)。下面看個示例:

encodeURI("http://www.cnblogs.com/a file with spaces.html")
// outputs http://www.cnblogs.com/a%20file%20with%20spaces.html

    可以看到僅僅把空格替換成了20%,所以此方法可用於對網址進行編碼。

    由於encodeURI不對冒號(:)、斜杠(/)進行編碼,所以如果參數(如把網址作為參數)中包含冒號(:)、斜杠(/),就會解析出錯,所以此方法不能對參數進行編碼。

 

   encodeURIComponent:用於對網址參數進行編碼

    encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

    可以看到此方法對:/都進行了編碼,所以不能用它來對網址進行編碼。由於此方法對中文,空格,井號(#),斜線(/),冒號(:)都進行了編碼,所以適合對URI中的參數進行編碼。看下面的示例:

var param="博客園";
var url="http://www.cnblogs.com/?key="+encodeURIComponent(param)+"&page=1";
console.log(url);//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1

 

 三、總結

  這里我並沒有寫的很詳細,只是達到了我的目的,故暫時記錄這么多。

  因為問題出現傳遞的參數里包含特殊符號而導致參數獲取錯誤,故這里在url 拼接參數的時候,將參數的值編碼后傳遞即可(原理如此,不限語言)

 

參考博客:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html

,"utf-8") 


免責聲明!

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



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