request.getParameter()在get和post方法中文亂碼問題
亂碼原因:Http請求傳輸時將url以ISO-8859-1編碼,伺服器收到位元組流後預設會以ISO-8859-1編碼來解碼成字元流(造成中文亂碼)
post請求:
假設提交請求的jsp頁面是UTF-8編碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
解決方法1:在服務端獲取引數前,先設定解碼方式。 原文:https://blog.csdn.net/u013476542/article/details/52845547
//設定解碼方式,對於簡體中文,使用UTF-8解碼 request.setCharacterEncoding("UTF-8"); request.getParameter("引數名");
解決方法2:Tomcat預設編碼ISO8859-1,設定成其他的編碼
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444"
useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
重點在 userBodyEncodingForURI 和 URIEncoding 這兩個屬性
下面來解釋一下這兩個屬性的意義
useBodyEncodingForURI引數表示是否用request.setCharacterEncoding引數對URL提交的資料和表單中GET方式提交的資料進行重新編碼,在預設情況下,該引數為false。
URIEncoding引數指定對所有GET方式請求進行統一的重新編碼(解碼)的編碼。
URIEncoding和useBodyEncodingForURI區別是,
URIEncoding是對所有GET方式的請求的資料進行統一的重新編碼,
而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding引數對資料進行的重新編碼,不同的頁面可以有不同的重新編碼的編碼
解決方法3:通過字串和位元組流轉換時使用正確的編碼獲取中文引數
String str = new String(request.getParameter("引數名").getBytes("iso-8859-1"), "utf-8");
get請求:
對於get請求,上面針對於post的請求的三種解決方法,只有第三種可以用,第一種和第二種並沒有效果,這和tomcat的內部機制有關。 對於get請求,還有一個很笨拙的方法,不推薦使用,貼出來,以供瞭解:
/獲取請求裡包含的查詢字串
String rawQueryStr = request.getQueryString();
out.println("原始查詢字串為:" + rawQueryStr + "<hr/>");
//使用URLDecoder解碼字串
String queryStr = java.net.URLDecoder.decode(
rawQueryStr , "gbk");
out.println("解碼後的查詢字串為:" + queryStr + "<hr/>");
//以&符號分解查詢字串
String[] paramPairs = queryStr.split("&");
for(String paramPair : paramPairs)
{
out.println("每個請求引數名、值對為:" + paramPair + "<br/>");
//以=來分解請求引數名和值
String[] nameValue = paramPair.split("=");
out.println(nameValue[0] + "引數的值是:" +
nameValue[1]+ "<hr/>");
}
</pre><p></p><p><span style="color:rgb(56,56,56); font-family:"Trebuchet MS",Helvetica,"Microsoft YaHei",Georgia,sans-serif; font-size:13px; line-height:23px">亂碼原因:Http請求傳輸時將url以ISO-8859-1編碼,伺服器收到位元組流後預設會以ISO-8859-1編碼來解碼成字元流(造成中文亂碼)</span></p><p><span style="font-family:Trebuchet MS,Helvetica,Microsoft YaHei,Georgia,sans-serif; color:#383838"><span style="font-size:13px; line-height:23px">post請求:</span></span></p><p><span style="font-family:Trebuchet MS,Helvetica,Microsoft YaHei,Georgia,sans-serif; color:#383838"><span style="font-size:13px; line-height:23px">假設提交請求的jsp頁面是UTF-8編碼</span></span></p><p><span style="font-family:Trebuchet MS,Helvetica,Microsoft YaHei,Georgia,sans-serif; color:#383838"><span style="font-size:13px; line-height:23px"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%></span></span></p><p><span style="font-family:Trebuchet MS,Helvetica,Microsoft YaHei,Georgia,sans-serif; color:#383838"><span style="font-size:13px; line-height:23px">解決方法1:在服務端獲取引數前,先設定解碼方式。</span></span></p><p><span style="font-family:Trebuchet MS,Helvetica,Microsoft YaHei,Georgia,sans-serif; color:#383838"><span style="font-size:13px; line-height:23px"></span></span></p><pre name="code" class="java" style="color: rgb(56, 56, 56); font-size: 13px; line-height: 23px;">//設定解碼方式,對於簡體中文,使用UTF-8解碼
request.setCharacterEncoding("UTF-8");
request.getParameter("引數名");