1、場景:
一、我在客戶端要經過get方式調用服務器端的url,將中文參數作utf-8編碼,須要在js中兩次的進行編碼,服務器端才能用decode方法一次獲取。
例如:
- var xing=encodeURIComponent(encodeURIComponent(xing));
二、若是我在客戶端用java輸出漢字做爲參數,而且用http協議,也是須要兩次才能在服務器端正常的一次decode
- xing=URLEncoder.encode(xing,"UTF-8");
- 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"));
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"));
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"));