Java本身就支持多國語言編碼,不需要寫任何程序,可以很簡單的 實(shí)現(xiàn)。 秘訣就是兩點(diǎn):
1、所有HTML/JSP頁面全部采用UTF-8編碼
2、客戶端瀏覽器完全支持UTF-8編碼
步驟: 1、首先把所有的HTML/JSP的ContentType都設(shè)為UTF-8
2、然后對于JSP程序中的非ASCII碼提示信息都不應(yīng)該寫在程序里面,都應(yīng)該放在 application.properties里面統(tǒng)一管理。
3、對HTML用native2ascii工具統(tǒng)一做一次處理,把HTML中的非ASCII碼都轉(zhuǎn)換為Unicode編碼。
4、針對不同的語言,寫不同的application.properties,比如說簡體中文是 application_zh_CN.properties,繁體中文是application_zh_TW.properties這樣,然后對這些配置信 息文件同樣用native2ascii工具處理一次,把非ASCII碼統(tǒng)統(tǒng)轉(zhuǎn)為Unicode編碼。
5、在Servlet的request.getCharacterEncoding()獲得客戶端的操作系統(tǒng)默認(rèn)編碼,然后set到Struts 的HTTPSession的Locale中。
OK!現(xiàn)在不同的客戶訪問,就會(huì)顯示不同的語言版本了。你可以看看此時(shí)你的瀏覽器的字符集,就是 UTF-8?,F(xiàn)在你的網(wǎng)站和Google一樣了,嘿嘿,其實(shí)你有心的話,看看你的瀏覽器訪問Google的時(shí)候是 什么字符集吧
切記:所有的HTML/JSP都要設(shè)為UTF-8編碼,所有的文件中的非ASCII碼字符都要用native2ascii工具轉(zhuǎn) 為用ASCII表示的Unicode編碼。 ---------------------------------------- 上面所述是我從網(wǎng)上下的一篇于中文問題的解決方案,確切的說應(yīng)該是關(guān)于Struts的國際化問題,下面我結(jié)合我的實(shí)踐談?wù)劸唧w如何實(shí)現(xiàn)Struts的國際化問題,我對理論不是非常精通,我只能完全憑自己的理解和實(shí)踐來講述,所以下面講的內(nèi)容可能不是非常正確,還請大家原諒。但有一點(diǎn)可以肯定,我通過自己的努力解決了Struts的中文問題,并實(shí)現(xiàn)Struts的國際化,其實(shí)一切并不復(fù)雜,下面是具體步驟:
0.遇到的問題(這些問題也許不會(huì)同時(shí)出現(xiàn)) a.中文數(shù)據(jù)從數(shù)據(jù)庫中到j(luò)sp中后就變成了"????" b.做好的中文properties文件,其中的中文value在頁面顯示亂碼 c.jsp文件中的中文到瀏覽器后顯示時(shí)也是亂碼(建議不要在jsp文件中輸入中文,盡量放在properties文件中) d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼 e.當(dāng)更換本地瀏覽器的語言選項(xiàng)時(shí),Web應(yīng)用程序不能自動(dòng)根據(jù)你的locale選擇合適的*.properties文件。導(dǎo)致Web應(yīng)用程序不能國際化。 1.環(huán)境: Web服務(wù)器: Tomcat 5.0.19 操作系統(tǒng): Win2000 Server JVM : jdk 1.4 數(shù) 據(jù) 庫: Oracle 8.1.7 開發(fā)工具: struts studio 5.2 pro for eclipse 2.先將所有*.jsp 網(wǎng)頁中開頭處加入
<%@ page language="java" contentType="text/html; charset=utf-8" %> 再設(shè)置<html:html locale = "true">
3.然后編輯好兩個(gè)*.properties文件,放在classes文件夾下你指定的地方,這里是放在/web-inf/classes/com/wiley 下,它們分別是:
ApplicationResources.properties (英文資源文件) ApplicationResources_zh.properties (中文資源文件) 隨便用什么工具編寫都行?。?br> 4.將ApplicationResources_zh.properties轉(zhuǎn)碼成gb2312。上面引文說要轉(zhuǎn)成UTF-8,結(jié)果我試了,不行。轉(zhuǎn)成gb2312就行了,操作是。 將ApplicationResources_zh.properties更名為ApplicationResources_xx.properties 在DOS命令行進(jìn)入ApplicationResources_xx.properties所在的文件夾 使用命令:native2ascii -encoding gb2312 ApplicationResources_xx.properties ApplicationResources_zh.properties(至于你為什么會(huì)出現(xiàn)“native2ascii不是內(nèi)部命令”,,請查其它資料,可能你要設(shè)置環(huán)境變量,因?yàn)樗莏dk的文件夾bin下的一個(gè)應(yīng)用程序) 5.接下來配置struts-config.xml,很簡單,我們加入:
<message-resources parameter="com.wiley.ApplicationResources"/> 就行了;
到此已能解決大多數(shù)中文問題。如上面所說的a,b,e 現(xiàn)在打開瀏覽器,選擇菜單:工具》internet選項(xiàng)》語言,將“中文-中國[zh-cn]”刪掉,添加一個(gè)“英語-英國[zh-gb]”確定后,重啟Tomcat,輸入網(wǎng)址你就會(huì)發(fā)現(xiàn),你的頁面的文本信息就會(huì)用的是ApplicationResources.properties (英文資源文件)中的內(nèi)容。如果換回“中文-中國[zh-cn]”,它就會(huì)顯示ApplicationResources_zh.properties (中文資源文件)中的中文內(nèi)容。
至于問題“c.jsp文件中的中文到瀏覽器后顯示時(shí)也是亂碼” 你就要用與第4步類似的方法來重新對*.jsp 文件編碼,這時(shí)-encoding的參數(shù)就要用UTF-8了,如果你用的也是struts studio 5.2 pro for eclipse工具,這一步就免了。它會(huì)自動(dòng)用UTF-8的格式存儲(chǔ)。 至于問題“d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼”的解決,我只是加了個(gè)過濾器。 你可以現(xiàn)在web.xml中加入: <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>com.wiley.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>ignore</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <servlet-name>action</servlet-name> </filter-mapping>
然后在你指定的包內(nèi)加個(gè)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;
/** * <p>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:</p> * <ul> * <li><strong>encoding</strong> - The character encoding to be configured * for this request, either conditionally or unconditionally based on * the <code>ignore</code> initialization parameter. This parameter * is required, so there is no default.</li> * <li><strong>ignore</strong> - If set to "true", any character encoding * specified by the client is ignored, and the value returned by the * <code>selectEncoding()</code> method is set. If set to "false, * <code>selectEncoding()</code> is called <strong>only</strong> if the * client has not already specified an encoding. By default, this * parameter is set to "true".</li> * </ul> * * <p>Although this filter can be used unchanged, it is also easy to * subclass it and make the <code>selectEncoding()</code> method more * intelligent about what encoding to choose, based on characteristics of * the incoming request (such as the values of the <code>Accept-Language</code> * and <code>User-Agent</code> headers, or a value stashed in the current * user‘s session.</p> * * @author <a href="mailto:jwtronics@yahoo.com">John Wong</a> * * @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 filter chain.doFilter(request, response);
}
/** * Place this filter into service. * * @param filterConfig The filter configuration object */ public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) this.ignore = true; else if (value.equalsIgnoreCase("true")) this.ignore = true; else if (value.equalsIgnoreCase("yes")) this.ignore = true; else this.ignore = false;
}
// ------------------------------------------------------ Protected Methods
/** * Select an appropriate character encoding to be used, based on the * characteristics of the current request and/or filter initialization * parameters. If no character encoding should be set, return * <code>null</code>. * <p> * The default implementation unconditionally returns the value configured * by the <strong>encoding</strong> initialization parameter for this * filter. * * @param request The servlet request we are processing */ protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}//EOC 到此我遇到的中文問題已全部得到解決,并從中理解到struts的國際化的深刻含義。 我個(gè)人覺得struts作為一個(gè)功能強(qiáng)大的應(yīng)用框架,應(yīng)該早就考慮到它的國際化問題,并在實(shí)際應(yīng)用中不會(huì)很復(fù)雜,只要我們遵循一些規(guī)則,就可以盡情享受struts給我們帶來的無窮樂趣。希望以上所述對大家有所幫助。
方案二
一種Struts國際化處理的思路- -
一、Struts的國際化 Struts是一種支持國際化的MVC的Web Framework??墒侨绾蝸硎褂胹truts國際化是一個(gè)問題。下面我們來探討一下,如何實(shí)現(xiàn)Struts的國際化。Web程式的國際化涉及到3個(gè)層面的東西。第一、jsp部分的輸入/輸出;第二、應(yīng)用處理程序的國際化;第三、DB的國際化問題。這里主要探討的是jsp部分的輸入/輸出問題。
二、靜態(tài)部分的國際化 Struts的jsp頁面靜態(tài)內(nèi)容(包括靜態(tài)文字,靜態(tài)圖片)國際化問題,是通過資源文件來實(shí)現(xiàn)的。要實(shí)現(xiàn)國際化,需要做如下幾項(xiàng)工作:1、定義web.xml的動(dòng)ActionServlet的參數(shù);2、定義資源文件;3、定義JSP頁面的字符集合;4、在JSP頁面獲取資源文件里面的內(nèi)容。 1、定義web.xml的動(dòng)ActionServlet的參數(shù) <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>application</param-name> <param-value>ApplicationResources</param-value> <!-- 默認(rèn)資源文件名 --> </init-param> <load-on-startup>2</load-on-startup> </servlet>
2、定義資源文件 在/WEB-INF/classes下面添加UTF-8資源束文件。每一個(gè)資源文件是“鍵-值”對的集合。在JSP頁面里面可以通過鍵來找到相應(yīng)的數(shù)據(jù)值。本例子的文件名是ApplicationResources,所以相應(yīng)的資源文件束是(包括e文,簡體中文,繁體中文) ApplicationResources.properties : 默認(rèn)資源文件。當(dāng)在其他資源文件里面找不到某個(gè)資源的時(shí)候,就使用該資源文件里面的定義。 ApplicationResources_zh_CN.properties:簡體中文資源文件。 ApplicationResources_zh_TW.properties:繁體中文資源文件。 資源文件的格式為:默認(rèn)資源文件名_國別_語言.properties。其中每個(gè)文件都是通過%JAVA_HONE%/BIN/native2ascii.exe工具轉(zhuǎn)換而來。你也可以使用其他工具來處理得到(http://java./products/jilkit/ 有一個(gè)工具Internationalization Java Internationalization and Localization Toolkit 可以處理)。下面是一個(gè)例子,我們顯示如何使用%JAVA_HONE%/BIN/native2ascii.exe命令來定義資源束文件。 2.1 準(zhǔn)備文件 //ApplicationResources.properties ;默認(rèn)資源文件,通常里面的內(nèi)容是英文的。 label.username=USERNAME : label.password=PASSWORD :
//ApplicationResources_zh_CN.bak ;簡體中文的資源文件。里面的內(nèi)容是中文的。它需要工具將其中的內(nèi)容處理成UTF-8 label.username=用戶名 : label.password=密 碼 :
//ApplicationResources_zh_TW.bak : 繁體中文的資源文件。里面的內(nèi)容是中文的。它需要工具將其中的內(nèi)容處理成UTF-8,下面的內(nèi)容是繁體碼。 label.username=ノめ?W : label.password=ノめ?W :
2.2 準(zhǔn)備完成以后,使用如下的命令創(chuàng)建UTF-8資源文件束 native2ascii -encoding gb2312 ApplicationResources_zh_CN.bak ApplicationResources_zh_CN.properties native2ascii -encoding big5 Applica tionResources_zh_TW.bak ApplicationResources_zh_TW.properties
3、定義JSP頁面的字符集合 定義JSP頁面的語言為UTF-8。在每個(gè)JSP頁面,必須有如下的內(nèi)容(如果使用的模板技術(shù),則只是需要在模板頁面添加,其他使用該模板的頁面無需添加) <%@ page contentType="text/html;charset=UTF-8"%>
4、在JSP頁面獲取資源文件里面的內(nèi)容。 在JSP里面需要顯示靜態(tài)內(nèi)容的地方使用<bean:message />strus的bean tag包里面的message標(biāo)簽。例如下面的頁面
<table> <tr> <td align="right"><bean:message key="label.username" /></td> </tr> <tr> <td align="right"><bean:message key="label.password" /></td> </tr> </table>
好了,在這個(gè)頁面顯示的時(shí)候,如果客戶的IE的語言集合是zh_CN的話,就會(huì)顯示 用戶名: 口 令:
如果是客戶的IE的語言是zh_TW的話,就會(huì)顯示 用戶名: 用戶名:
可以在IE的工具->Internet選項(xiàng)->語言的地方,來選擇,定義IE的語言。
三、表單的數(shù)據(jù)的處理。 對于表單數(shù)據(jù)的處理,我們是通過添加一個(gè)Filter來實(shí)現(xiàn)的。所有提交的請求,都需要做字符處理。然后在web.xml里面定義該Filter。這樣我們就不需要在程序里面做任何的字符處理。 3.1 定義Filter。下面是一個(gè)例子。 package com.webapps.commons;
import java.io.*; import javax.servlet.*;
public class CharsetEncodingFilter implements Filter{ private FilterConfig config = null; private String defaultEncode = "UTF-8";
public void init(FilterConfig config) throws ServletException { this.config = config; if(config.getInitParameter("Charset")!=null){ defaultEncode=config.getInitParameter("Charset"); } }
public void destroy() { this.config = null; }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletRequest srequest=request; srequest.setCharacterEncoding(defaultEncode); chain.doFilter(srequest,response); } }
3.2 在web.xml里面聲明使用該Filter <filter> <filter-name>Character Encoding</filter-name> <filter-class>com.webapps.commons.CharsetEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
四、擴(kuò)展 待續(xù)的是應(yīng)用程序部分的國際化問題,和DB的國際化問題。
對于使用者來說,一個(gè)支持國際化的WEB程序具有下面幾種形式
1. 根據(jù)用戶瀏覽器自動(dòng)設(shè)置顯示的語言(無需用戶干預(yù)) 2. 提供用戶選擇,用戶根據(jù)自己的需要決定使用何種語言顯示 3. 結(jié)合前兩種.系統(tǒng)自動(dòng)選擇一種語言,但同時(shí)提供用戶根據(jù)需要選擇
使用Struts開發(fā)國際化程序是一件非常便利的事情,我們來看前兩種怎么來實(shí)現(xiàn)
1. 這是最簡單的方式,你不需要修改任何程序,只需要把資源文件按照各個(gè)語言翻譯一遍并把這些文件按照國際化程序的要求命名好放置同一個(gè)目錄即可. 例如 ApplicationResource_en_US.properties ApplicationResource_zh_TW.properties . 這種方式雖然自動(dòng)的給用戶設(shè)置好要顯示的語言,但是有時(shí)候由于瀏覽器本身的問題,或者用戶自己想看其他語種的時(shí)候就沒有辦法.
2. 這是比較常見的方式,由用戶自己來選擇所要顯示的語言. 一般的情況是在首頁或者登錄頁上增加語言的選項(xiàng),用戶選中其中一種登錄后即以用戶選擇的語言進(jìn)行顯示,但是用戶登錄后必須把用戶所選擇的語言保存起來并讓程序也就是<bean:message這些標(biāo)簽可以使用所選擇的語言加載配置信息,因此在用戶登錄執(zhí)行的Action類中加入如下代碼
Locale locale = new Locale(request.getParameter("locale")); //TODO:判斷l(xiāng)ocale的有效性,無效的話不存入到sesssion中 req.getSession().setAttribute(Globals.LOCALE_KEY,locale);
好了,現(xiàn)在<bean:message/>這個(gè)標(biāo)簽庫現(xiàn)在就可以根據(jù)你保存在session中的Locale對象來決定加載的是哪種語言, 通過看<bean:message/>標(biāo)簽庫的源碼我們就可以一目了然知道該標(biāo)簽庫在加載資源前先從session或者該Locale對象,如果為空則使用request.getLocale()這個(gè)值來加載對應(yīng)語言的資源,因此這種做法實(shí)際上是實(shí)現(xiàn)了前面提到的第三種形式. 接下來就是翻譯資源文件,有如第一步講到的.
Struts框架在實(shí)現(xiàn)國際化應(yīng)用程序的時(shí)候還是替我們想的很周到,因此你所需要做的就是翻譯.
最后切記兩點(diǎn): 1. 頁面的字符集必須是UTF-8,例如: <%@ page language="java" contentType="text/html;charset=UTF-8" %> 2. 另外頁面的所有的提示信息都應(yīng)該在資源文件中定義
|
|