這幾天有些空閒,就對網絡應用(Web Application)支持中文進行了一次簡單的試驗,現在總結一下。由於是第一次接觸,錯誤難免,望指正幫助。
試驗方法是在數據庫中建立一個表格,如student表,然後建立一個網絡應用程序,對該表中的數據進行查詢與編輯。結構是 JSP——JavaBean——Controller——DAO,只用servlet(JSP2.0?)技術。
開發環境是Linux(平台缺省編碼是UTF?8); 網絡服務器TOMCAT5.0.28;數據庫是PostgreSQL/MySQL。
整個試驗的思路是,從客戶端(browser)到我的應用程序,再到數據庫存取,如果所有過程均采用UTF?8編碼的話,數據應保持完整性,即不應出現亂碼問題。
首先確定數據庫支持UTF?8編碼。利用數據庫交互程序,往建好的表中直接寫入中文數據,發現一切正常(你甚至不需要規定數據庫編碼為UNICODE, 可能是因為我的操作系統的缺省編碼是UNICODE的原故)。
這樣看來,出現亂碼的主要原因,可能在於應用程序的編寫以及客戶與服務器數據傳輸的過程。試驗證明,對於從數據庫中提取數據時,關鍵是在有關JSp源文件頭部聲明應用程序的編碼:<%@ page pageEncoding="UTF-8" %>.因Tomcat5在將JSP編譯時,其使用的缺省編碼並非UNICODE, 因此就有可能造成數據丟失或錯誤。
同樣,在處理來自客戶端的數據輸入時,在拿參數之前,也要相應設好數據編碼,以避免Tomcat用其缺省的編碼來對數據流進行解釋。試驗中采用本站網友提出的辦法,即用Filter的方式對請求的數據進行編碼設定。經此處理後,其他相關源代碼中對參數的獲取己其他處理等,不需要作任何特別的處理。
其簡單源代碼如下:
import Java.io.IOException;
import Javax.servlet.*;
/**
* a filter to set the coming request encoding to a desired charset.
*/
public class EncodingFilter implements Filter {
private static String desired_charset = "UTF-8";
// gets defined encoding from web.XML
public void init(FilterConfig conf) throws ServletException {
desired_charset = conf.getInitParameter("charset");
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding(desired_charset); // sets request encoding.
chain.doFilter(req, res);
}
public void destroy() {}
}
//----------------------------------------------------------------
//配置文件 "web.XML", showing the declaration of the above filter:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.sun.com/XML/ns/J2EE web-app_2_4.xsd"
version="2.4">
......
總結如下:
1:網絡應用程序支持中文的主要問題在於有些服務器(servlet container)的缺省編碼不是UNICODE。
2:解決的辦法是通過對服務器的配置或在應用程序源代碼中,指定希望采用的編碼。
3:在應用程序源代碼中指定編碼,主要在JSP源文件中包括<%@ page pageEncoding="UTF-8" %>;而處理客戶端所傳數據時,可利用Filter來設定所需的編碼。
4:通過統一從客戶端到數據庫的編碼為UNICODE,如UTF?8,同一個網絡應用程序可以支持多種語言。
5:改用MySQL數據庫系統後,應用程序仍然工作良好。
存在問題:
由於好奇,將此網絡應用程序部署到WindowsXP下進行調試,數據庫與服務器均不變(當然是Windows版本)。程序運行良好。但由於此WindowsXP的缺省編"CP1521”(-:something like that),而並非UTF?8, 因此,通過數據庫交互程序直接對數據庫進行查詢,Console輸出亂碼(PostreSql)。
最後,告訴大家今年聽到的一句話:“生活會讓你失去自信的”。