關於 web中 使用 java.net.URLEncoder.encode 要編碼兩次呢 , js的encodeURIComponent 同理



因為在jsp中對中文進行了編碼的時候用的是UTF-8的編碼方式, 而在servlet中調用request.getParameter();方法的時候使用服務器指定的原始編碼格式(ISO-8859-1 自動解碼一次,所以前台編碼一次后台解碼一次而解碼和編碼的方式不用所以造成了亂碼的出現,
 
這就類似於以下代碼:
    
    
    
            
  1. String name=java.net.URLEncoder.encode("測試", "UTF-8");
  2. System.out.println(name);
  3. System.out.println(java.net.URLDecoder.decode(name, "ISO-8859-1"));

編碼后的是%E6%B5%8B%E8%AF%95;
而用ISO-8859-1解碼后的是???è?;
 
但是如果調用的是

    
    
    
            
  1. System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

則結果是打印“測試”;因為沒有經過 request.getParameter();方法,所以不會亂碼
 
這就印證了 之前為什么我在servlet中調用java.net.URLDecoder.decode(request.getParameter("name"), "UTF-8")方法和調用java.net.URLDecoder.decode(request.getQueryString(), "UTF-8")所得到的結果是不一樣的,就是由於在request.getParameter("name")之前會自動做一次解碼的工作,而且是默認的ISO-8859-1。
 
所以,在使用java.net.URLEncoder.decode()和java.net.URLDecoder.decode(),的時候需要在前端頁面中使用兩次java.net.URLDecoder.decode()方法。
 
使用兩次編碼的過程相當於如下代碼:
            
   
   
   
           
  1. String name=java.net.URLEncoder.encode("測試", "UTF-8");
  2. System.out.println(name);
  3. name=java.net.URLEncoder.encode(name,"UTF-8");
  4. System.out.println(name);
  5. name=java.net.URLDecoder.decode(name, "UTF-8");
  6. System.out.println(name);
  7. System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

 
輸出為:
 
            %E6%B5%8B%E8%AF%95
            %25E6%25B5%258B%25E8%25AF%2595
            %E6%B5%8B%E8%AF%95
            測試
 
第一次編碼后將漢字編碼為%和字母數字的格式, 而第二次編碼的時候是對%字母數字進行編碼,雖然解碼的時候使用的是ISO-8859-1,但是對於%和字母數字而言用ISO-8859-1和UTF-8解碼出來的是一樣的,此時就回到了漢字被編碼過一次的字符串了,當再次進行解碼的時候使用UTF-8就回將它轉會漢字;

 js的encodeURIComponent 的同理

ps: request.getParameter();方法會 自動按照默認 ISO-8859-1 解碼一次,所以要連續UTF-8編碼兩次,因為第二次UTF-8編碼的%和數字與 ISO-8859-1解碼的結果都是一樣的,所以第二次編碼是關鍵






免責聲明!

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



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