javaURL中文亂碼的問題

 
1、場景:
一、我在客戶端要經過get方式調用服務器端的url,將中文參數作utf-8編碼,須要在js中兩次的進行編碼,服務器端才能用decode方法一次獲取。
例如:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. var xing=encodeURIComponent(encodeURIComponent(xing));  
二、若是我在客戶端用java輸出漢字做爲參數,而且用http協議,也是須要兩次才能在服務器端正常的一次decode
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. xing=URLEncoder.encode(xing,"UTF-8");  
  2. xing=URLEncoder.encode(xing,"UTF-8");  

服務器端只須要一次decode xing=URLDecoder.decode(xing, "UTF-8");


 
2、原理:
由於在jsp中對中文進行了編碼的時候用的是UTF-8的編碼方式,而在servlet中調用request.getParameter();方法的時候使用服務器指定的編碼格式自動解碼一次,因此前臺編碼一次後臺解碼一次而解碼和編碼的方式不用因此形成了亂碼的出現,

這就相似於如下代碼:

           
String name=java.net.URLEncoder.encode("測試", "UTF-8");
System.out.println(name);
System.out.println(java.net.URLDecoder.decode(name, "ISO-8859-1"));

編碼後的是%E6%B5%8B%E8%AF%95。。
而用ISO-8859-1解碼後的是???è?。。

可是若是調用的是
System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

則結果是打印「測試」。

這就印證了 以前爲何我在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()方法。

使用兩次編碼的過程至關於以下代碼:
複製代碼
String name=java.net.URLEncoder.encode("測試", "UTF-8");
System.out.println(name);
name=java.net.URLEncoder.encode(name,"UTF-8");
System.out.println(name);
name=java.net.URLDecoder.decode(name, "UTF-8");
System.out.println(name);
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就回將它轉會漢字。
相關文章
相關標籤/搜索