Request.getParameter亂碼

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.