1. 程式人生 > >request.getParameter()在get和post方法中文亂碼問題

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("引數名");