1. 程式人生 > >中文問題和國際化問題的終極解決方案

中文問題和國際化問題的終極解決方案

Java本身就支援多國語言編碼,不需要寫任何程式,可以很簡單的 實現。 祕訣就是兩點:
  
  1、所有HTML/JSP頁面全部採用UTF-8編碼
  
  2、客戶端瀏覽器完全支援UTF-8編碼
  
  步驟:
  1、首先把所有的HTML/JSP的ContentType都設為UTF-8
  
  2、然後對於JSP程式中的非ASCII碼提示資訊都不應該寫在程式裡面,都應該放在
  application.properties裡面統一管理。
  
  3、對HTML用native2ascii工具統一做一次處理,把HTML中的非ASCII碼都轉換為Unicode編碼。
  
  4、針對不同的語言,寫不同的application.properties,比如說簡體中文是
  application_zh_CN.properties,繁體中文是application_zh_TW.properties這樣,然後對這些配置信
  息檔案同樣用native2ascii工具處理一次,把非ASCII碼統統轉為Unicode編碼。
  
  5、在Servlet的request.getCharacterEncoding()獲得客戶端的作業系統預設編碼,然後set到Struts
  的HTTPSession的Locale中。
  
  OK!現在不同的客戶訪問,就會顯示不同的語言版本了。你可以看看此時你的瀏覽器的字符集,就是
  UTF-8。現在你的網站和Google一樣了,嘿嘿,其實你有心的話,看看你的瀏覽器訪問Google的時候是
  什麼字符集吧
  
  切記:所有的HTML/JSP都要設為UTF-8編碼,所有的檔案中的非ASCII碼字元都要用native2ascii工具轉
  為用ASCII表示的Unicode編碼。
  
  --------------------------------------
  上面所述是我從網上下的一篇於中文問題的解決方案,確切的說應該是關於Struts的國際化問題,下面我結合我的實踐談談具體如何實現Struts的國際化問題,我對理論不是非常精通,我只能完全憑自己的理解和實踐來講述,所以下面講的內容可能不是非常正確,還請大家原諒。但有一點可以肯定,我通過自己的努力解決了Struts的中文問題,並實現Struts的國際化,其實一切並不複雜,下面是具體步驟:
  
  0.遇到的問題(這些問題也許不會同時出現)
  a.中文資料從資料庫中到jsp中後就變成了"????"
  b.做好的中文properties檔案,其中的中文value在頁面顯示亂碼
  c.jsp檔案中的中文到瀏覽器後顯示時也是亂碼(建議不要在jsp檔案中輸入中文,儘量放在properties檔案中)
  d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼
  e.當更換本地瀏覽器的語言選項時,Web應用程式不能自動根據你的locale選擇合適的*.properties檔案。導致Web應用程式不能國際化。
  1.環境:
  Web伺服器: Tomcat 5.0.19
  作業系統: Win2000 Server
  JVM : jdk 1.4
  數 據 庫: Oracle 8.1.7
  開發工具: struts studio 5.2 pro for eclipse
  2.先將所有*.jsp 網頁中開頭處加入
  
  再設定
  3.然後編輯好兩個*.properties檔案,放在classes資料夾下你指定的地方,這裡是放在/web-inf/classes/com/wiley 下,它們分別是:
  
  ApplicationResources.properties (英文資原始檔)
  ApplicationResources_zh.properties (中文資原始檔)
  隨便用什麼工具編寫都行啊!
  4.將ApplicationResources_zh.properties轉碼成gb2312。上面引文說要轉成UTF-8,結果我試了,不行。轉成gb2312就行了,操作是。
  將ApplicationResources_zh.properties更名為ApplicationResources_xx.properties
  在DOS命令列進入ApplicationResources_xx.properties所在的資料夾
  使用命令:native2ascii -encoding gb2312 ApplicationResources_xx.properties ApplicationResources_zh.properties(至於你為什麼會出現“native2ascii不是內部命令”,,請查其它資料,可能你要設定環境變數,因為他是jdk的資料夾bin下的一個應用程式)
  5.接下來配置struts-config.xml,很簡單,我們加入: 就行了;
  
  到此已能解決大多數中文問題。如上面所說的a,b,e 現在開啟瀏覽器,選擇選單:工具》internet選項》語言,將“中文-中國[zh-cn]”刪掉,新增一個“英語-英國[zh-gb]”確定後,重啟Tomcat,輸入網址你就會發現,你的頁面的文字資訊就會用的是ApplicationResources.properties (英文資原始檔)中的內容。如果換回“中文-中國[zh-cn]”,它就會顯示ApplicationResources_zh.properties (中文資原始檔)中的中文內容。
  
  至於問題“c.jsp檔案中的中文到瀏覽器後顯示時也是亂碼” 你就要用與第4步類似的方法來重新對*.jsp 檔案編碼,這時-encoding的引數就要用UTF-8了,如果你用的也是struts studio 5.2 pro for eclipse工具,這一步就免了。它會自動用UTF-8的格式儲存。
  至於問題“d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼”的解決,我只是加了個過濾器。
  你可以現在web.xml中加入:
  
  Set Character Encoding
  com.wiley.SetCharacterEncodingFilter
  
  encoding
  utf-8
  
  ignore
  true
  
  Set Character Encoding
  action
  
  然後在你指定的包內加個java檔案 我放在了/web-inf/classes/com/wiley 裡,下面是原始碼:
  /*
  * XP Forum
  *
  * Copyright (c) 2002-2003 RedSoft Group. All rights reserved.
  *
  */
  package com.huahang.tj.struts.filters;
  
  import javax.servlet.*;
  import java.io.IOException;
  
  /**
  *
  Filter that sets the character encoding to be used in parsing the
  * incoming request, either unconditionally or only if the client did not
  * specify a character encoding. Configuration of this filter is based on
  * the following initialization parameters:
  
  *
  
  *
  encoding - The character encoding to be configured
  * for this request, either conditionally or unconditionally based on
  * the ignore initialization parameter. This parameter
  * is required, so there is no default.
  *
  ignore - If set to "true", any character encoding
  * specified by the client is ignored, and the value returned by the
  * selectEncoding() method is set. If set to "false,
  * selectEncoding() is called only if the
  * client has not already specified an encoding. By default, this
  * parameter is set to "true".
  *
  
  *
  *
  Although this filter can be used unchanged, it is also easy to
  * subclass it and make the selectEncoding() method more
  * intelligent about what encoding to choose, based on characteristics of
  * the incoming request (such as the values of the Accept-Language
  * and User-Agent headers, or a value stashed in the current
  * user´s session.
  
  *
  * @author John Wong
  *
  * @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $
  */
  public class SetCharacterEncodingFilter implements Filter {
  
  // ------------------------ Instance Variables
  
  /**
  * The default character encoding to set for requests that pass through
  * this filter.
  */
  protected String encoding = null;
  
  /**
  * The filter configuration object we are associated with. If this value
  * is null, this filter instance is not currently configured.
  */
  protected FilterConfig filterConfig = null;
  
  /**
  * Should a character encoding specified by the client be ignored?
  */
  protected boolean ignore = true;
  
  
  // ---------------------Public Methods
  
  /**
  * Take this filter out of service.
  */
  public void destroy() {
  
  this.encoding = null;
  this.filterConfig = null;
  
  }
  
  /**
  * Select and set (if specified) the character encoding to be used to
  * interpret request parameters for this request.
  *
  * @param request The servlet request we are processing
  * @param result The servlet response we are creating
  * @param chain The filter chain we are processing
  *
  * @exception IOException if an input/output error occurs
  * @exception ServletException if a servlet error occurs
  */
  public void doFilter(ServletRequest request, ServletResponse response,
  FilterChain chain)
  throws IOException, ServletException {
  
  // Conditionally select and set the character encoding to be used
  if (ignore || (request.getCharacterEncoding() == null)) {
  String encoding = selectEncoding(request);
  if (encoding != null)
  request.setCharacterEncoding(encoding);
  }
  
  // Pass control on to the next