Request.getParameter亂碼

今天做項目,做到頁面跳轉去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));


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章