国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java平臺I18N 支持概述

2019-11-18 14:11:31
字體:
來源:轉載
供稿:網友

  一、國際化和 java 編程語言

和大多數使用其它語言的程序員不同,Java 程序員是大量構建在 JDK 中提供 I18N 支持的標準代碼的受益者。大部分代碼最初來自 IBM 的 Taligent 子公司(自從合并進 IBM 以后),代表了許多人年的工作成果,比大多數公司獨安閑其產品中提供的代碼要切實可行得多。

這些代碼及其遠見并不總是完美的;例如,請看一下 java.util.Date 類中許多棄用的(dePRecated)方法。我們中的許多人可能記得太平洋標準時間(Pacific Standard Time)顯然也是 Java 世界時間(Java World Time)。然而,即使在“錯誤的舊時代”,其它語言也沒有能與這種內置的功能匹敵的東西,即便有,也很少。這一節的頁面簡要地討論了 Java 平臺支持的一般國際化領域。


二、Unicode 支持

Java 語言字符集是 Unicode,而且相應地,原始 char 數據類型的長度是兩個字節(16 位),以容納 Unicode 值。由于大家熟悉的 String 由 char 組成,因此 String 也是基于 Unicode 的。Unicode 本身是這樣定義的:值 0 到 127 匹配標準 ASCII,0 到 255 匹配 ISO 8859-1 (Latin-1) 標準。由于這一起始值的一致性,不使用 I18N 功能或不需要面對 I18N 問題的程序員可以編寫他們的 Java 程序而無需理解或知道 Unicode。然而,考慮到 Windows 的普遍使用,該平臺的程序員應該知道標準 ISO 8859-1 和 Windows Latin-1 (cp1252) 之間的差異。

16 位 char 長度答應 0 到 65535 之間的值。提供了 Unicode 轉義以在本地平臺不支持實際字符時仍然答應輸入。其格式是“u”后跟 0000 到 FFFF 的四個十六進制數字。例如,下面兩行代碼是等價的:


char c1 = ´a´;
char c2 = ´u0061´;


JDK/JRE 的 1.3 版本支持 Unicode 2.1;1.4 版本支持 Unicode 3.0。更多關于 Unicode 和稱為 UniBook 的 Unicode 顯示程序的信息,請參閱參考資料中到 Unicode Consortium 的鏈接。


三、字符集轉換和流輸入/輸出

上一頁提到過 Java 字符集是 Unicode,但并不是所有平臺都支持 Unicode。那么,這個戲法是怎么完成的呢?答案是:所有支持字符的輸入和輸出流 ? 即 java.io.Reader 和 java.io.Writer 層次結構 ? 自動調用在平臺的本地編碼和 Unicode 之間執行轉換的隱藏代碼層。請注重,本地編碼是假設的。假如數據不是缺省編碼的,您將不得不自己轉換數據。幸運的是,java.io.InputStreamReader、java.io.OutputStreamWriter 和 java.lang.String 類具有答應使用受支持的編碼的轉換規范的方法。您可以在 JDK 文檔(可以從參考資料訪問)的 Internationalization 節中的 Supported Encodings 下面找到它們。請注重,JDK 1.4 現在對泰國語和印地語提供支持。

有趣的是,Java 對數字的大尾數格式提供保證,而對于 char 數據類型卻不支持這一保證。缺省格式同平臺有關。例如,在 NT 4.0 上,系統特性“sun.io.unicode.encoding”被設置成“UnicodeLittle”。假如因為某種原因您想自己指定該格式,那么您可以根據文檔來選擇 UnicodeBig、UnicodeBigUnmarked、UnicodeLittle、UnicodeLittleUnmarked、UTF8 或 UTF-16。


四、字符分類與 Character 類

除了以標準方式為多種語言定義字符之外,Unicode 也為每個字符定義了幾個特性。這些特性標識諸如一般類別、雙向性、大寫、小寫以及該字符是數字還是控制字符等事情。在可以從 Unicode Consortium 網站上獲得的 UnicodeData 文件中定義了這些特性。

Java Character 類提供獲取這些特性的方法。雖然特定實例是不變的,但是許多方法是靜態的,答應實時訪問字符的特性。

該類有用性的一個示例來自一個典型的 ASCII 編程算法:許多程序員利用了這樣一個事實,假如字符值在 0x41 和 0x5A 之間,那么它是大寫字母(A-Z)。加上 0x20,您就得到小寫字母(a-z)。遺憾的是,假如處理的語言包含有超出 ASCII 范圍的字符時,該算法會失效。 解決方案是使用 Character.isUpperCase() 和 Character.toLowerCase(),它們在任何情況下都起作用。另外一個示例是 Character.isDigit(),它也用于表示 ASCII‘0’到‘9’以外的數字的字符。


五、語言環境

在 Java 語言中,語言環境(locale)僅僅是一個標識符,而不是一組本地化的屬性。java.util.Locale 類的一個實例表示一個特定的地理政治區域,使用表示語言、區域以及國家或地區的參數創建。每個與語言環境相關的類都維護著它自己的一組本地化屬性,并且確定如何對含有 Locale 參數的方法請求做出響應。

按照以前的陳述,很明顯,沒有關于程序員可能怎樣對含有 Locale 參數的方法請求做出響應的約束。然而,在 Sun 的參考 Java 2 平臺和其它一致實現中,有一組一致的受支持的本地化實現。更多信息,請參閱 JDK 文檔(可以從參考資料訪問)中的 Internationalization 一節中 Supported Locales。應該注重,該文檔將多種語言環境列為“也提供了,卻未測試(also provided, but not tested)”。我個人看見這一“未測試”問題出現在 JDK 1.3.1 中的 Finnish (fi_FI) 語言環境;買主自行當心。


六、AWT/Swing Name 和 Locale 屬性

java.awt.Component 類包含 Name 和 Locale 屬性的讀方法和寫方法。雖然文檔也討論了 Component 的構造器及其使用 Name 參數的子類,但我顯然需要倍加小心,因為我以前從未找到它們。Component 位于大多數 Swing 類的層次結構中,它們也自動支持這些屬性。

Name 屬性是一個您可以通過編程進行賦值的不可本地化的 String。這有助于國際化 ? 聽起來可能有些希奇,但是隨著大多數數據根據語言環境改變時,Name 提供了一個標識組件的設置錨點。當然,在一個給定的類里,為對象等同性測試對象引用可以達到相同的目的。雖然每種技術都有極好的理由,但我通常在 actionPerformed() 方法中使用對象等同性測試,如同您在代碼示例中看到的那樣。文檔聲明:假如不通過編程設置 Name,那么將賦予一個缺省值,但不給出值或模式。在我編寫的代碼中,假如在調用 Component.setName("aName") 之前調用了 Component.getName(),它將返回 null。當然,作為未在文檔中記錄的行為,結果可能不一致,并且可能會在將來發生改變。因此,當將使用 Name 屬性時,良好的編程實踐要求將所有組件的 Name 屬性設置成標準值(也就是“取消設置”),然后適當地設置想要的組件。

Locale 屬性答應組件跟蹤它自己的語言環境,即便是應用程序的其余部分正在使用不同的語言環境。在某些情況下,該項技術非常有用,雖然對于具有文本值的 Component,可以在將文本發送給 Component 之前對它執行本地化,而無需設置特定的 Component Locale。


七、本地化的資源

java.util.ResourceBundle 是一個為存儲和定位由應用程序使用的資源提供機制的抽象類。資源通常是本地化的 String,但也可以是任何 Java 對象。ResourceBundle 以一種層次結構建立,它以一個具有基礎名稱的一般 ResourceBundle 開始,然后通過向另外的 ResourceBundle 的基礎名添加語言和國家或地區標識(它們在 JDK 文檔 Internationalization 一節的 Supported Locales 中有定義,可以從參考資料訪問這一節),使這種層次結構變得更為特定。ResourceBundle 的三大優點是:

類裝入器機制用于定位 ResourceBundle,因此無需額外的 I/O 代碼。


ResourceBundle“知道”如何通過使用 static getBundle(String baseName) 或 getBundle(String baseName, Locale locale) 方法,按照從特定到一般的順序,搜索層次結構以尋找適合于語言環境的實例。


假如在特定實例中沒有找到資源,那么將使用來自更一般實例的資源。
好消息/壞消息是:ResourceBundle 實例一旦被裝入,將被以性能優化的名義進行高速緩存;這一高速緩存從不會被更新,并且沒有操作該高速緩存的正式方法。

ResourceBundle 有兩個子類:

ListResourceBundle,它是另一個抽象類,因此您必須提供自己的實現。首先,您必須覆蓋 getContents(),它返回二維 Object 數組(Object[][])。這種 ResourceBundle 可以返回任何類型的 Object。


PropertyResourceBundle,它是一個由 java.util.Properties 文件支持的具體類,它只能返回 String。
您也可以提供您自己的定制子類。在這種情況下,您必須覆蓋并實現 handleGetObject() 和 getKeys(String key)。

ResourceBundle 使用鍵/值對,并提供 getString(String key) 和 getObject(String key) 方法。您也可以使用 getKeys() 來獲得可用鍵的 Enumeration。


八、日歷與時區支持

最初打算將 java.util.Date 用來處理日期與時間操作,但是內在的缺陷導致其只能以時間的形式表示具體時刻。JDK 1.1 中引入了抽象類 java.util.Calendar 及其具體子類 java.util.GregorianCalendar 來處理 java.util.Date 的不足。Calendar 類具有獲取所有日期與時間字段以及執行日期與時間運算的方法。

抽象 java.util.TimeZone 類及其具體子類 java.util.SimpleTimeZone 維護全球統一時間(Universal Coordinated Time(縮寫為 UTC,而不是您期待的 UCT;由于歷史原因這一縮寫取自法語形式))的標準時及夏令時的偏差值。此外,TimeZone 也含有獲取本機及本地化時區顯示名稱的方法。


九、格式化與解析

數字、貨幣、日期、時間以及程序消息都受到文化及地區差異的影響,并且對于本地化需要大量的格式化與解析工作。創建了抽象類 java.text.Format 及其子類來處理這一 I18N 領域的問題。所有這些子類都有與語言環境相關的 format() 和 parse() 方法來以與語言環境相關的方式操作值。碰到非法值,parse() 方法將拋出 ParseException。具體子類 java.text.SimpleDateFormat 和 java.text.DecimalFormat 答應模式及對實例的適當符號的訪問。通常,抽象父類擁有返回適當本地化的對象的 getInstance() 和 getXXXInstance() 靜態工廠方法。

下面是 java.text.Format 的直接子類的列表:

抽象 java.text.DateFormat 類及其具體子類 java.text.SimpleDateFormat,由 java.text.DateFormatSymbols 類支持,用于處理日期與時間值。


抽象 java.text.NumberFormat 類及其具體子類 java.text.ChoiceFormat 和 java.text.DecimalFormat,由 java.text.DecimalFormatSymbols 類支持,用于處理數字、貨幣及百分數。


java.text.MessageFormat 答應“軟編碼的”位置及格式化要插入本地化的消息的值。
對于 JDK/JRE 1.4,已經添加了 java.util.Currency 以使得可以獨立于語言環境使用貨幣。java.text.NumberFormat 擁有處理貨幣和整數的新方法。


十、與語言環境相關的 String 操作

作為開發人員,我們經常需要操作、搜索 String 以及對其排序。當涉及多種語言,這項工作的難度簡直令人難以置信。Java 平臺提供下列類以供幫助:

抽象 java.text.Collator 類及其具體子類 java.text.RuleBasedCollator 答應對與語言環境相關的 String 進行比較。


java.text.CollationElementIterator 類以給定的整理順序遍歷 String 的每個字符并返回其有序的優先級。


java.text.CollationKey 類表示一個由特定 Collator 治理的 String,它答應相對較快的排序比較。


java.text.BreakIterator 類以與語言環境相關的方式實現了定位斷行、斷句、斷詞和斷字符的位置的約定。


java.text.StingCharacterIterator 類對 Unicode 字符提供雙向遍歷,用于搜索 String 內的字符。


十一、輸入法

實際上,以上所有討論都涉及操作或顯示數據。然而,必須以某種方式輸入數據。對于最終用戶,最常用的是鍵盤。但是,假如鍵盤不支持某種語言輸入所需的字符,您該怎么辦呢?

輸入法(Input method)是答應數據輸入的軟件組件的一個技術術語。Java 平臺既答應使用主機 OS 輸入法也答應使用基于 Java 語言的輸入法。假如您需要實現輸入法,您可以使用輸入法框架(Input Method Framework)。您可以在 JDK 文檔中 Internationalization 一節中的 Input Method Framework(可以從參考資料中訪問該文檔)中找到輸入法客戶機 API(Input Method Client API)及輸入法引擎 SPI(Input Method Engine SPI)的規范、參考和教程。

--摘自IBM 網站

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达尔| 顺义区| 汪清县| 吐鲁番市| 琼海市| 阿拉善右旗| 囊谦县| 皮山县| 佛坪县| 成安县| 沅江市| 永年县| 新巴尔虎左旗| 玉林市| 城步| 龙门县| 沈阳市| 平山县| 海淀区| 苍溪县| 鄂尔多斯市| 上犹县| 黄平县| 商都县| 浏阳市| 温宿县| 收藏| 新竹市| 隆尧县| 南华县| 太白县| 施秉县| 从化市| 禹州市| 柘荣县| 大兴区| 泾阳县| 津南区| 无极县| 军事| 大名县|