蘇 蘊 菏澤學(xué)院計算機與信息工程系 274000
Java Web開發(fā)中國際化問題的設(shè)計與實現(xiàn)
蘇 蘊 菏澤學(xué)院計算機與信息工程系 274000
國際化問題是Java Web技術(shù)開發(fā)中備受矚目的課題。鑒于此,本文在分析對字符集選擇的基礎(chǔ)上,介紹了一種高效的解決方案——使用J2SE資源綁定的方式。
世界經(jīng)濟日益全球化推動了人們對基于 Web 的軟件的需求,因為許多國家的用戶都能訪問Web軟件。然而,隨著信息的國際化,如何動態(tài)構(gòu)建一個具有各種不同語言的Web應(yīng)用程序,成為面向國際應(yīng)用的企業(yè)和個人需要考慮的問題。
為了能在計算機中表示不同語言中字符,每個國家(或區(qū)域)都規(guī)定了計算機信息交換用的字符編碼集,如美國的ASCII,中國GB2312和GBK,日本的JIS等。而不同語言客戶在瀏覽不同語言網(wǎng)頁時,往往會因為相互間所使用字符集無法兼容而出現(xiàn)亂碼情況。
Java內(nèi)部采用Unicode字符集,Unicode字符集,對每一種語言的每個字符制定了統(tǒng)一且唯一的用兩個字節(jié)(也有四字節(jié)的)來表示的編碼,滿足跨語言、跨平臺的字符解碼和轉(zhuǎn)換處理。但由于Unicode字符集不兼容ISO-8859-1字符集,占用的空間大(對于英文字母,Unicode也需要兩個字節(jié)來表示),而且不便于傳輸和存儲,因此而產(chǎn)生了UTF字符集?,F(xiàn)在流行的UTF有2種:UTF-8和UTF-16。其中UTF-16和Unicode本身的編碼規(guī)范是一致的,而UTF-8不同,它定義了一種“區(qū)間規(guī)則”,這種規(guī)則可以和ISO-8859-1編碼保持最大程度的兼容,同時也可以用來表示所有語言的字符。因此,在開發(fā)國際化Web應(yīng)用程序時,UTF-8是一個最理想的選擇。
具體的做法是:
(1)所有HTML或JSP/Servlet動態(tài)頁面指明使用UTF-8字符集,JSP文件本身也使用UTF-8編碼保存;
<%@page language="java" contentType="text/html; charset=UTF-8"%>;
;)
(2)Servlet 指明使用過濾器,使所有來自瀏覽器的請求(request)和響應(yīng)(response)均轉(zhuǎn)換為UTF-8;
request.setCharacterEncoding ("UTF-8");
response.setContentType("text/ html;charset= UTF-8");
(3)設(shè)定數(shù)據(jù)庫連接方式是UTF-8(例如:數(shù)據(jù)庫使用MySQL);
jdbc:mysql://localhost/ web_site?
useUnicode=true&characterEncoding= UTF-8;
(4)數(shù)據(jù)庫編碼指明為UTF-8。
為了滿足國際化的需求,被開發(fā)的Web應(yīng)用程序應(yīng)該能夠在不做任何修改的情況下,就可以在不同的地區(qū)和不同的語言環(huán)境下,按照當(dāng)?shù)氐恼Z言和格式習(xí)慣顯示字符。一種傳統(tǒng)的解決問題的方法是:存儲多組JSP,每組JSP都用不同的語言編碼,然后根據(jù)用戶的地區(qū)選擇在這些JSP之間切換。這種解決方案的最大不足在于表示層JSP頁面將非常冗余,當(dāng)需要更新特定于語言的JSP集時,所有冗余編碼的JSP集都必須同時更新,對于一個中等規(guī)模的項目而言,這會造成冗長的、容易出錯的更新。
最理想的實現(xiàn)國際化的方法是將要顯示的字符內(nèi)容從程序中分離,然后統(tǒng)一存儲到一個資源包中,當(dāng)顯示時,從包中取出和Locale對象相一致字符內(nèi)容。這種方案利用了J2SE在資源綁定中對地區(qū)的支持,即只在需要的時候在采用特定于地區(qū)的文本字符串。
在編寫國際化程序時,要為不同的國家和語言編寫不同的資源類,這些資源類同屬于一個資源系列,共享同一個基名。不同語言所對應(yīng)的資源類的名稱為基名加上ISO-639標(biāo)準的語言代碼,而應(yīng)用于某個特定國家或地區(qū)的資源類名稱,則是基名和語言代碼后加上ISO-639標(biāo)準的國家或地區(qū)代碼。例如:為了能使中文國家地區(qū)以及英語國家地區(qū)的用戶都能以本地語言的形式顯示某網(wǎng)站的頁面內(nèi)容,可以創(chuàng)建一個資源包的基名為“MyResource”,則中文國家的特定資源屬于MyResource_zh_CN類,英語國家的特定資源屬于MyResource_en類。
針對不同的語言和國家,分別提供一個屬性文件,屬性文件的命名遵照資源類的命名方式,擴展名為.properties,將所有的字符串資源以鍵值對的形式寫入到屬性文件中。
由于Java的資源綁定機制只接受ASCII編碼的屬性文件,因此,對于資源包文件中的非ASCII碼字符,需要將其轉(zhuǎn)換為相應(yīng)的Unicode碼,其格式為uXXXX。這里可以使用JDK開發(fā)工具包里的native2ascii命令進行轉(zhuǎn)換。其命令為:
Native2ascii -encoding gb2312 MyResource.tmp MyResource_zh_CN.properties
將MyResource.tmp文件中的中文字符轉(zhuǎn)換為Unicode編碼保存到MyResource_zh_CN.properties文件中。
可以在用戶訪問網(wǎng)站首頁面index.jsp時,對此請求進行過濾。具體情形如下圖所示:
在過濾器中,調(diào)用Locale類的getDefault方法得到當(dāng)前平臺默認的語言環(huán)境值,由于用戶在訪問該Web應(yīng)用程序期間,一般不會改變顯示語言。因此,需要把特定的地區(qū)對象和會話關(guān)聯(lián)起來。
在JSP頁面中,首先獲取與當(dāng)前會話相關(guān)聯(lián)的Locale對象,該對象代表了特定的國家或地區(qū)。其次,根據(jù)該Locale對象,獲取與其綁定的某個資源包文件。這里可以調(diào)用java.util.ResourceBundle類中的getBundle方法:
public static final ResourceBundle getBundle(String baseName,Locale locale)
最后,利用ResourceBundle類的getString()方法得到相應(yīng)語言版本的字符串。
public final String getString (String key)
使用J2SE資源綁定的方式解決國際化問題,能夠根據(jù)不同的Locale對象加載不同的資源,顯示給用戶。要修改顯示信息時,只需要修改相應(yīng)的資源文件,對于程序部分,不需要做任何的修改。因此,可以說它是目前在Web應(yīng)用程序開發(fā)中,解決國際化問題效率最高的方案。
[1]李謹.淺析基于JSP的維、漢雙語網(wǎng)站的開發(fā)技術(shù)[J].科技創(chuàng)新導(dǎo)報.2009(2)
[2]Ivor Horton.Java 2入門經(jīng)典[M].北京:機械工業(yè)出版社.2006
[3]孫鑫.Java Web開發(fā)詳解[M].北京:電子工業(yè)出版社.2007
[4]耿祥義,張躍平.JSP實用教程[M].北京:清華大學(xué)出版社.2007
TP391.41
A
10.3969/j.issn.1001-8972.2010.20.043
Java Web;國際化;字符集