程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 網絡應用程序支持中文的簡單試驗

網絡應用程序支持中文的簡單試驗

編輯:關於JAVA

這幾天有些空閒,就對網絡應用(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">

  

  

  Character Encoding Filter

  john.control.EncodingFilter

  

  charset

  UTF-8

  

  

  

  

  Character Encoding Filter

  /*

  

  

  ......

  

  

  

  總結如下:

  

  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)。

  

  最後,告訴大家今年聽到的一句話:“生活會讓你失去自信的”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved