encodeURIComponent編碼時為什么要編碼兩次


Why 要對url進行編碼

  當使用地址欄提交查詢參數時,如果不編碼,非英文字符會按照操作系統的字符集進行編碼提交到服務器,服務器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。

 

Why encodeURIComponent / encodeURI編碼時要編碼兩次 ?

  encodeURI使用的是 UTF-8 編碼規則來編的,當服務器接收url的參數后會自動解碼一次,但自動解碼的字符集不一定是UTF-8,

  字符集不一致時解碼會出現亂碼。

 

下邊會詳細介紹一次和兩次編碼的情況

一次encodeURIComponent編碼的情況:

   前端代碼:

var encodeUrl = encodeURIComponent("http://www.test.com/s?state=1&paramName=張三");

  后端代碼:

String paramValue = request.getParameter(paramName);

  用getParameter接收后,Tomact會自動解碼,

  如果Tomact接收請求的編碼格式是UTF-8的話,解碼后沒有問題;

  如果不是UTF-8的話就會出現亂碼

  

兩次encodeURIComponent編碼的情況:

  前端代碼:

var Url = encodeURIComponent("http://www.test.com/s?state=1&paramName=張三");
var Url2 = encodeURIComponent(encodeUrl);

  后端代碼:

String name1 = request.getParameter(paramName);
String name2 = java.net.URLDecoder.decode(name1,"UTF-8"); 
  Url是將中文編碼成ASCII碼后的URL;
  Url2是將ASCII碼編碼后的URL,由於用GBK、UTF-8、ISO-8859-1對ASCII碼編碼的結果是相同的,
  所以request.getParameter("name")解碼的時候,不管是按 GBK 還是 UTF-8 還是 ISO-8859-1 都好,都能夠正確的得到URL。

 補充如何設置Tomcat接收請求的編碼格式:

    可以利用request.setCharacterEncoding("UTF-8");來設置Tomcat接收請求的編碼格式,

      但是只對POST方式提交的數據有效,對GET方式提交的數據無效!

      要設置GET的編碼,可以修改server.xml文件中,相應的端口的Connector的屬性:URIEncoding="UTF-8",這樣,GET方式提交的數據才會被正確解碼。如下圖:

 
        

    


 

  -THE END-


免責聲明!

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



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