首先出現中文亂碼的原因是tomcat默認的編碼方式是"ISO-8859-1",這種編碼方式以單個字節作為一個字符,而漢字是以兩個字節表示一個字符的。
一,get請求參數中文亂碼的解決辦法
對於get請求解決中文亂碼有兩種途徑一種是修改tomcat默認的編碼方式為"UTF-8"
在tomcat的server.xml里把
<Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
修改為
<Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
使用這種方式帶來的問題是在你本機上這么做沒有問題,你無論怎么去修改你tomcat上的配置都沒問題,
但是測試環境和生產環境的服務器不是輕易說改就能改的,特別是有些公司的服務器是租賃的,那么在我們
不知道測試環境和生產環境服務器配置的時候就要使用以下的方法來解決get請求的中文亂碼問題。
來自頁面的一個get請求:
window.location.href = getContextPath()+"/manage/user/detail?name="+encodeURI(encodeURI("小明"));
服務器端:
String name = request.getParameter("name");
orgname = URLDecoder.decode(name,"UTF-8");
因為get請求的參數在請求行上,我們不能像解決post請求那樣使用 request.setCharacterEncoding("UTF-8");這種方式是修改方法體的編碼方式。
所以只能使用以上的方式分別對請求行的漢字進行編碼和解碼。其實解決get請求中文亂碼問題最好的方式是避免使用中文,比如上面的name="小明",
如果name是一個恆定值的話,你可以在你的程序里這樣寫:
window.location.href = getContextPath()+"/manage/user/detail?name="+encodeURI(encodeURI("xiaoming"));
public static final String NAME = "xiaoming";//定義一個常量
String name = request.getParameter("name");
if(name.equals(NAME)){
name = "小明"
}
如果你必須傳中文,而且name這個參數的值是動態的,不斷變化的,建議你在數據庫里面建立一張表,
讓你的中文參數的值都有一個對應的id,在請求發送錢先查一下這張表。
二,post請求參數中文亂碼的解決辦法
對於post請求,請求中問亂碼的兩種解決辦法,就喜聞樂見了。一般也不會有post請求參數中文亂碼吧,認為任何一個java的web項目因該都配置了字符集過濾器吧。
但為了這文章的完整性和以后工作學習方便,我還是把這兩種方法貼上來吧。
(1): request.setCharacterEncoding("UTF-8");
(2):
<filter>
<description>字符集過濾器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<description>字符集編碼</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>