亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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 網站

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二区大胆人体摄影专业网站| 久久久久99精品久久久久| 欧美激情欧美狂野欧美精品| 国产精品成人一区二区| 亚洲色在线视频| 91高清视频免费观看| 97精品一区二区三区| 岛国av在线不卡| 538国产精品一区二区在线| 66m—66摸成人免费视频| 久久视频在线视频| 亚洲曰本av电影| 日韩欧亚中文在线| 91国产中文字幕| 91精品久久久久久久久久久久久久| 伊是香蕉大人久久| 精品香蕉一区二区三区| 国产91精品久久久久久| 国产精品国产亚洲伊人久久| 日韩毛片在线观看| 国产精品99久久久久久白浆小说| 久久免费福利视频| 欧美精品九九久久| 欧美疯狂做受xxxx高潮| 国产精品自产拍高潮在线观看| 91九色蝌蚪国产| 国产在线观看不卡| 性色av一区二区咪爱| 欧日韩不卡在线视频| 日韩有码在线电影| 久久久精品国产| 欧美性生活大片免费观看网址| 91精品久久久久久久| 中文字幕亚洲色图| 欧洲精品在线视频| 成人444kkkk在线观看| 国产丝袜一区视频在线观看| 久久久综合av| 久久综合国产精品台湾中文娱乐网| 欧美激情视频一区二区三区不卡| 日韩欧美精品网址| 日韩精品免费综合视频在线播放| 国产一区二区三区高清在线观看| 亚洲成avwww人| 国产成人免费91av在线| 成人中文字幕+乱码+中文字幕| 亚洲第一页中文字幕| 欧美日韩在线一区| 国产精品久久久久aaaa九色| 欧美中文在线视频| 亚洲男人7777| 欧美日韩黄色大片| 国产视频丨精品|在线观看| 高清欧美性猛交xxxx| 久久久久久亚洲精品中文字幕| 97视频在线看| 中文字幕v亚洲ⅴv天堂| 欧美电影在线观看网站| 国产日本欧美一区| 91精品国产777在线观看| 国产精品免费久久久久久| 九九精品在线视频| 日韩视频免费在线观看| 色综合亚洲精品激情狠狠| 欧美日本高清视频| 日韩美女在线播放| 日韩在线播放一区| 精品久久久久久亚洲精品| 国产精品成人一区二区三区吃奶| 亚洲第五色综合网| 中文字幕日韩免费视频| 亚洲男人天堂古典| 欧美成人精品激情在线观看| 综合国产在线视频| 亚洲免费影视第一页| 国产精品6699| 国产精品一久久香蕉国产线看观看| 国产欧美亚洲视频| 97精品久久久| 欧美色道久久88综合亚洲精品| 亚洲精品久久久久久久久久久久| 97久久精品视频| 97涩涩爰在线观看亚洲| 国产精品jizz在线观看麻豆| 国产精品久久久久77777| 97精品国产aⅴ7777| 成人黄色短视频在线观看| 97国产精品人人爽人人做| 久久久久久久亚洲精品| 国产国产精品人在线视| 亚洲午夜av久久乱码| 国产丝袜一区二区三区免费视频| 在线性视频日韩欧美| 国产精品观看在线亚洲人成网| 欧美日韩一区二区在线播放| 国产精品久久久久久久久久新婚| 俺也去精品视频在线观看| 国产日韩精品一区二区| 国产不卡一区二区在线播放| 91国偷自产一区二区三区的观看方式| 国产精品极品美女粉嫩高清在线| 国产日本欧美视频| 久久久亚洲欧洲日产国码aⅴ| 亚洲一区二区三区777| 欧美精品videos另类日本| 亚洲精品久久久久久下一站| 91色视频在线导航| 久久99久国产精品黄毛片入口| 精品精品国产国产自在线| 久久91精品国产91久久久| 亚洲人成电影网| 国产午夜精品全部视频播放| 国产精品老女人视频| 中文字幕亚洲欧美一区二区三区| 日韩欧美在线观看| 91老司机在线| 国产美女精彩久久| 伦伦影院午夜日韩欧美限制| 国产精品观看在线亚洲人成网| 久久久女人电视剧免费播放下载| 亚洲国产精品成人av| 国产精品色悠悠| 日本精品久久久久影院| 日韩三级影视基地| 亚洲国产高清福利视频| 久久精品免费播放| 国产一区二区三区在线观看网站| 69久久夜色精品国产69乱青草| 国产精品电影网| 亚洲三级 欧美三级| 在线成人中文字幕| 久久久国产91| 国产精品久久久久久影视| 91欧美精品午夜性色福利在线| 欧美电影《睫毛膏》| 久久精品电影一区二区| 最近的2019中文字幕免费一页| 亚洲色图第三页| 国产精品久久99久久| 97不卡在线视频| 蜜臀久久99精品久久久无需会员| 中文字幕久久精品| 高清欧美性猛交xxxx| 国产午夜精品一区二区三区| 欧美日韩激情网| 97精品在线观看| 欧美视频专区一二在线观看| 国产精品久久久久久久久久免费| 亚洲最新在线视频| 日韩精品在线视频观看| 最新日韩中文字幕| 欧美激情二区三区| 亚洲欧洲第一视频| 91精品国产91久久久| 亚洲综合av影视| 2018中文字幕一区二区三区| 成人免费视频在线观看超级碰| 91精品国产91久久久| 日韩欧美在线视频| 欧美成人一区在线| www.欧美三级电影.com| 精品日韩美女的视频高清| 日本中文字幕不卡免费| 国产精品高清免费在线观看|