中文亂碼總整理 (Tomcat 5.5)

之前舊的部落格發過幾篇解決 Tomcat 中文亂碼問題的文章,確實是解決了一些中文顯示的問題,但今天在 Struts2 時,又再度遇到中文亂碼的問題,所以想把幾個可能忽略的步驟記錄下來。

其實解決中文亂碼,只要把所有的編碼格式都調整成一致,比如說,編輯器預設儲存編碼為 Big5,卻把頁面設定成 <%@ page contentType="text/html; charset=utf-8" %>,這樣一來,在瀏覽器開啟的網頁,中文就會是亂碼。(反過來也會是亂碼)。唯有兩者設定都是相同編碼的時候,在網頁上才能正確顯示中文。

上面提到,把所有的編碼都設成 Big5,這麼一來,也符合了「所有編碼都設為相同」的原則,當然包括編輯器預設儲存編碼也是 Big5,如此網頁可以正確顯示中文字,但是 … 如果後端需要加上 MySQL 資料庫,如何在表單跟 MySQL 之間正確傳遞中文,可能又會是一個花時間的問題,經過幾番折騰之後,決定把所有的編碼都設定為 utf-8 比較方便。

編輯器預設儲存編碼 => 設定成 UTF-8

以 EditPlus3 為例,可從「工具」->「偏好項」->「檔案」->「預設編碼模式」改成 UTF-8,
注意之前可能存成 Big5 的,可以按另存新檔後,最下面編碼模式可以改變。

每個 JSP 頁面 charset 設定成 UTF-8

e.g. <%@ page contentType=”text/html; charset=utf-8″ %>

MySQL my.ini 設定成

[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8

資料庫、資料表及欄位的 character-set 設為 utf8,collation(校對)設定為utf8_unicode_ci。

資料庫連結部份修改

Connection con=DriverManager.getConnection(“jdbc:mysql://localhost/user?useUnicode=true&characterEncoding=utf8”, “帳號”, “密碼”);

Servlet 部份同樣把 charset 設定成 UTF-8

e.g. request.setContentType(“text/html; charset=utf-8”);

GET 亂碼解決

在 %TOMCAT_HOME%\conf\server.xml 中,找到<connector port=”8080″ … 部分,加上 URIEncoding = “UTF-8″,重啟 Tomcat。

POST 亂碼解決

若是有多個網站,將 %TOMCAT_HOME%\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class 複製到%TOMCAT_HOME%\shared\classes\filters 下,(若沒有資料夾可以自己新增),修改 %TOMCAT_HOME%\webapps\(mytest)\WEB-INF\web.xml (mytest 為網站目錄),加上以下內容

<filter>
  <filter-name>SetCharacterEncoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>Big5</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

照著這些步驟做,應該就能有個能正確顯示中文的平台(或許吧!至少小蛙現在的環境就是)如果發現什麼問題,再隨時補上。

2009/07/31 補充:
在使用 Prototype.js 的 Updater / Requester function 時,編碼為 big5 傳遞中文會發生亂碼,
PHP 的解決方式 -> header("Content-Type:text/html;charset=BIG5");
JSP 解決方式 ->  response.setHeader("Charset","BIG5"); 
這裡 AJAX 的傳遞方式要用 get。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *