由於在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就回將它轉會漢字。