Why 要對url進行編碼?
當使用地址欄提交查詢參數時,如果不編碼,非英文字符會按照操作系統的字符集進行編碼提交到服務器,服務器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。
Why encodeURIComponent / encodeURI編碼時要編碼兩次 ?
encodeURI使用的是 UTF-8 編碼規則來編的,當服務器接收url的參數后會自動解碼一次,但自動解碼的字符集不一定是UTF-8,
字符集不一致時解碼會出現亂碼。
下邊會詳細介紹一次和兩次編碼的情況
一次encodeURIComponent編碼的情況:
前端代碼:
var encodeUrl = encodeURIComponent("http://www.test.com/s?state=1¶mName=張三");
后端代碼:
String paramValue = request.getParameter(paramName);
用getParameter接收后,Tomact會自動解碼,
如果Tomact接收請求的編碼格式是UTF-8的話,解碼后沒有問題;
如果不是UTF-8的話就會出現亂碼
兩次encodeURIComponent編碼的情況:
前端代碼:
var Url = encodeURIComponent("http://www.test.com/s?state=1¶mName=張三"); 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-