今天做項目,做到頁面跳轉去request參數
發現中文參數是亂碼,於是上網查了相關資料:
http://hpfgc.blog.163.com/blog/static/147995572009111462947544/
http://blog.sina.com.cn/s/blog_632bb1950100l77z.html
http請求是以ISO-8859-1的編碼來傳送url的,如果頁面的content-type爲utf-8,那麼在發送請求時,會將字符轉成utf-8後進行傳送。
這樣服務器收到字節流後,將它轉成相應的字符,request.getParameter("xx")直接得到了字符串,從字節流到字符流的轉換系統幫我們做了(錯誤來源)
解決方案:
1. 沒有編碼的URL
HTML頁面:
var url = "./SuggestServlet?tagName="+document.getElementById('tagName').value;
參數是中文,傳遞到容器,由容器決定採用何種編碼解析
在使用java方法取參數時
String myparam = request.getParameter("tagName"); //得到的是一個亂碼字符串
request.getCharacterEncoding(); //得到的是一個null值
tomcat默認的是ISO-8859-1編碼解析,這就是我們得到亂碼的原因了。myparam = new String(myparam.getBytes("ISO-8859-1"),"UTF-8"); 這樣就能得到中文了,後面的根據charset的聲明來該,如果是GBK,就改成相應的就可以了。
2. 使用javascript的encodeURI編碼中文參數
HTML頁面:
var url = "./SuggestServlet?tagName="+encodeURI(document.getElementById('tagName').value);
這時候參數被編碼過了
到Servlet之後取這個參數
String myparam = request.getParameter("tagName"); //得到的是UTF-8編碼之後的字符串,不是亂碼
要獲得中文字符,我們還需要再轉換一次編碼
String decodingParam = URLDecoder.decode(myparam, "UTF-8");
做URL請求之前,應該使用JavaScript encodeURI(url)
在java中導入相應的類:
java.net.URLDecoder
java.net.URLEncoder
另外!!
在對後臺java程序賦值的時候,本身已經使用了一次解碼,不過解碼的結果依然不對。所以我們可以在頁面上進行兩次編碼操作,這樣後臺自動的那次就可以抵消掉一次,然後在使用 xx=java.net.URLDecoder.decode(xx,"UTF-8");/*需要處理異常*/進行一次解碼就好了。
var url = "./SuggestServlet?tagName="+encodeURI(encodeURI(document.getElementById('tagName').value));