1. 程式人生 > >解決Tomcat請求中文亂碼的問題

解決Tomcat請求中文亂碼的問題

在 Tomcat 中處理帶中文引數的get請求時,照著以往的做法,發現還是亂碼,這讓我丈二和尚摸不著頭腦,結果一查詢才發現,我所使用的 Tomcat8 已經對get方式中文亂碼進行了處理。Tomcat8 中終於不用為了編碼而折騰了。

原因

在Tomcat中,所有字元預設是按ISO-8859-1的編碼格式來編碼的,這是歐洲使用的一種字元編碼格式。在瀏覽器發起http請求時,將請求的url以及引數按伺服器指定的UTF-8編碼後傳送到Tomcat,這時Tomcat並不知道傳送來的字元是按什麼編碼的,使用預設的ISO-8859-1格式來解析字元,導致中文亂碼。Tomcat Http請求中文亂碼

解決

Tomcat8

高版本 Tomcat 中,Tomcat8 對 GET 的預設解碼為 UTF-8。只要沒有對 server.xml Connector 元素進行改動(對編碼部分進行引數配置),那麼,Tomcat8 對 GET 的預設解碼則為 UTF-8。也就不會亂碼了。

Tomcat7 及以下

Tomcat7 及以下版本,GET 方式提交的引數編碼,只支援 ISO8859-1 編碼。因此,有三個解決中文引數亂碼的方法: get方式傳值中文亂碼

  1. 在後臺轉換編碼,如下:

    String bname = request.getParameter("bname"); 
    bname = new
    String(bname .getBytes("iso8859-1"),"utf-8");

    當然,前提是你頁面編碼就是 UTF-8。如果是 GBK,那上面那句程式碼後面就改成 GBK。

  2. 在客戶端使用 encodeURI() 對中文引數進行編碼,在伺服器端需要進行解碼this.setName(java.net.URLDecoder.decode(name, “UTF-8”));

  3. 修改tomcat的server.xml檔案

    <Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout
    ="20000" redirectPort="8443" <!-- 新增引數 -->
    URIEncoding="GBK" useBodyEncodingForURI="true"/>

    同樣的,URIEncoding 需要與頁面編碼保持一致。

    URIEncoding 是請求的 URL 中字元的編碼,會將 URL 中 %xx 這樣的 URL 按這裡指定的編碼格式去解碼,如果不指定則會使用預設的 ISO-8859-1 。

    useBodyEncodingForURI=”true”,該屬性是使用 body 體的編碼格式去解析 URL 中的 %xx。

總結

Tomcat8 好。