Tomcat解決中文亂碼的幾種方式
阿新 • • 發佈:2019-01-23
一、對Tomcat_HOME/conf/server.xml檔案進行配置(本機的完整目錄為D:/Users/Administrator/Tomcat/apache-tomcat-7.0.54/conf/server.xml)
核心程式碼如下(其中最後一句是自己加的):
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="GBK" />
-->
這種方式一般不建議使用,因為它修改的是Tomcat平臺的編碼,而業內沒人對其不修改,如果人為修改會影響其他專案的執行。
二、逆向編碼解碼還原法
之所以會出現亂碼,是因為瀏覽器將中文傳給tomcat時,tomcat以預設的iso8859-1方式對其解碼,而iso8859-1不屬於中文碼錶,故而出現亂碼。根據這個原理可逆向還原。
如:
byte buf[] = request.getParameter("name").getBytes("iso8859-1");
String name = new String(buf,"GBK");
這樣得到的name便是前臺傳來的正確的中文引數了
這種方式比較偏向底層,而且有一個弊端,就是當瀏覽器傳送的中文引數很多時,需要一個個設定,比較羅嗦,不利於節省時間。
三、將瀏覽器的表單的提交方式設為post方式,同時在servlet裡在接受引數前將request的編碼設定為GBK或者UTF-8。
前臺形如:
<form action="login.jsp" method="post">
使用者名稱:<input type="text" name="name"><br/><br/>
密 碼:<input type="text" name="pwd"><br/><br/>
<input type="submit" value="登入">
</form>
後臺形如:
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
這樣也能正確地接受中文引數了。當然,這種方式也存在弊端,試想下當專案釋出後,如果需要修改編碼為GBK,則要修改原始碼,而對客戶而言,這需要反編譯等步驟直接修改程式碼,有點困難。
四、通過web專案的WebRoot/WEB-INF/web.xml檔案進行配置引數,同時可在servlet中進行讀取。
web.xml的示例核心程式碼如下:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>cn.hncu.servlets.LoginServlet</servlet-class>
<init-param>
<param-name>character</param-name>
<param-value>GBK</param-value>
</init-param>
</servlet>
servlet示例核心程式碼如下:
public void init(ServletConfig config) throws ServletException {
String charset = config.getInitParameter("character");
System.out.println(charset);
}
這種方法彌補了方法3的缺陷,方便後期維護和修改,使用者修改時不需要改原始碼,只需修改web.xml即可。