request亂碼問題(當我們提交的資料中含有中文資訊時),分兩種情況:
- 通過post方式提交資料給Servlet
Servlet服務端部分程式碼:
public void doPost(httpServletRequest request, httpServletResponse response) throws ServletException, IOException{ //在獲取使用者表單資訊之前把request的碼錶設定成UTF-8, //如果沒這句的話,如果提交中文資訊的時候,會亂碼。 request.setCharacterEncoding("UTF-8"); String value = request.getParameter("username"); //從request中獲取客戶端提交過來的資訊 System.out.println(value); }
- 通過get方式提交資料給Servlet (要手動處理)
Servlet服務端部分程式碼:
public void doGet(httpServletRequest request, httpServletResponse response) throws ServletException, IOException{ //從request中獲取客戶端提交過來的中文資訊,獲取到亂碼 String value = request.getParameter("username"); //拿到亂碼反向查詢 iso-8859-1 碼錶,獲取原始資料, //在構造一個字串讓它去查詢UTF-8 碼錶,已得到正常資料 value1 = new String (value.getBytes("iso-8859-1"), "UTF-8") ; System.out.println(value); }
- 用超連結提交表單資訊(通過 get 方式提交,需呼叫到doGet方法)
<a href="/Servlet/test?username=江西">登入<a/>
總結:
通過get提交表單資訊有兩種:
1.通過form表單的 method 設定 get方法提交(即method="get") 預設也是 get
通過get方法提交到 Servlet程式中, 首先是得到表單的資訊,但是亂碼,
然後還得手動去設定編碼方式
即 value1 = new String (value.getBytes("iso-8859-1"), "UTF-8")
2.通過超連結提交
通過post提交表單:
在form表單的 method 設定 post方法提交(即method="post") ,
通過post方法提交到 Servlet程式中,request 要在得到表單資訊之前 設定編碼方式
即 request.setCharacterEncoding("UTF-8");
get: 通過get提交表單的資訊,位址列上可以看到,安全性不好
post:通過post提交表單的資訊,位址列上看不到表單的資訊,
出現這種機制的原因:
在於http協議上,通過get提交的資訊加在url後面,所以能看到;
通過post提交的資訊是在請求體上的,也就是你敲了兩次回車後,傳送的資訊,所以看不到
如果以上方法沒有效果,可以嘗試使用java.net.URLDecoder.decode(URIString, "UTF-8")方法:
encodeURI和decodeURI是成對來使用的,因為瀏覽器的位址列有中文字元的話,可以會出現不可預期的錯誤,所以可以encodeURI把非英文字元轉化為英文編碼,decodeURI可以用來把字元還原回來。encodeURI方法不會對下列字元進行編碼:":"、"/"、";" 和 "?",encodeURIComponent方法可以對這些字元進行編碼。
decodeURI()方法相當於java.net.URLDecoder.decode(URIString, "UTF-8");
encodeURI()方法相當於java.net.URLEncoder.encode(URIString, "UTF-8");
二、例子
<script type="text/javascript"> var uriStr = "http://www.baidu.com?name=張三&num=001 zs"; var uriec = encodeURI(uriStr); document.write("編碼後的" + uriec); var uridc = decodeURI(uriec); document.write("解碼後的" + uridc); </script>
編碼後的http://www.baidu.com?name=%E5%BC%A0%E4%B8%89&num=001%20zs
解碼後的http://www.baidu.com?name=張三&num=001 zs