1. 程式人生 > >Tomcat解決中文亂碼的幾種方式

Tomcat解決中文亂碼的幾種方式

一、對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即可。