一般先得到一個Locale對象,然后,調用getInstance工廠方法來得到一個Collator對象。最后,當希望對字符串進行排序時,使用這個排序器的compare方法,而不是String類的compareTo方法。
Locale aLocale = new Locale("zh", "CN"); Collator collator = Collator.getInstance(aLocale); if(collator.compare("a", "b")<0){ System.out.PRintln(true); }最重要的是,Collator類實現了Comparator接口。因此,可以傳一個排序器對象到Collections.sort方法中來對一組字符串進行排序 。排序強度
你可以設置排序器的強度來選擇不同的排序行為。字符間的差別可以被分為首要的(primary)、 其次的(secondary)和再次的( tertiary)。比如,在英語中, “A”和“Z”之間的差別被歸為首要的,而“A”和“?”之間的差別是其次的, “A”和“a”之間是再次的。如果將排序器的強度設置成Collator.PRIMARY,那么排序器將只關注primary級的差別。如果設置成Collator.SECONDARY,排序器將把secondary級的差別也考慮進去。就是說,兩個字符串在“secondary”或“tertiary”強度下更容易被區分開來,如表5-4所示。如果強度被設置為Collator.IDENTICAL,則不允許有任何差異。這種設置在與排序器的第二種相當技術性的設置,即分解模式(decomposition mode),聯合使用時,就會顯得非常有用。
分解
Unicode標準對字符串定義了四種范化形式(normalization form):D、KD、C和KC 。這其中的兩種都是用于排序的。在范化形式D中,重音字符被分解為基字符和組合重音符。例如,?就被轉換成由字母A和上方組合環°構成的序列。范化形式KD更近一步地將兼容性字符(compatibility character)也進行了分解,例如ffi連字或商標符號TM 。
我們可以選擇排序器所使用的范化程度:Collator.NO_DECOMPOSITION表示不對字符串做任何范化,這個選項處理速度較快,但是對于以多種形式表示字符的文本就顯得不適用了;默認值Collator.CANONICAL_DECOMPOSITION使用范化形式D,這對于包含重音但不包含連字的文本是非常有用的形式;最后是使用范化形式KD的“完全分解”。
讓排序器去多次分解一個字符串是很浪費的。如果一個字符串要和其他字符串進行多次比較,可以 將 分 解 的 結 果 保 存 在 一 個 排 序 鍵 對 象 中 。getCollationKey方法返回一個CollationKey對象,可以用它來進行更深入的、更快速的比較操作。
Collator collator = Collator.getInstance(aLocale); String aString =""; CollationKey cKey = collator.getCollationKey(aString); if(cKey.compareTo(collator.getCollationKey(new String("")))==0){ } 最后,有可能在你不需要進行排序時,也希望將字符串轉換成它們的范化形式。例如,在將字符串存儲到數據庫中,或與其他程序進行通信時。從java SE 6.0開始,java.text.Normalizer類實現了對范化的處理。String aString ="??cvsz"; String bString = Normalizer.normalize(aString, Normalizer.Form.NFKD);Collatorstatic Locale[] getAvailableLocales()返回Locale對象的一個數組,通過它可以得到Collator對象。static Collator getInstance()static Collator getInstance(Locale l)為默認或給定的locale返回一個排序器。int compare(String a, String b)如果a在b之前,則返回負值;如果它們等價,則返回0,否則返回正值。boolean equals(String a, String b)如果它們等價,則返回true,否則返回false。void setStrength(int strength)int getStrength()設置或獲取排序器的強度。更強的排序器可以區分更多的詞。強度的值可以是Collator.PRIMARY、 Collator.SECONDARY和Collator.TERTIARY。void setDecomposition(int decomp)int getDecompositon()設置或獲取排序器的分解模式。分解越細,判斷兩個字符串是否相等時就越嚴格。分解的等級值可以是Collator.NO_DECOMPOSITION、 Collator.CANONICAL_DECOMPOSITION和Collator.FULL_DECOMPOSITION。CollationKey getCollationKey(String a)返回一個排序器鍵,這個鍵包含一個按特定格式分解的字符,可以快速地和其他排序器鍵進行比較。CollationKeyint compareTo(CollationKey b)如果這個鍵在b之前,則返回一個負值;如果兩者等價,則返回0,否則返回正值。Normalizerstatic String normalizer(CharSequence str, Normalizer.Form form)返回str的范化形式, form的值是ND、 NKD、 NC或NKC之一。消息格式化Java類庫中有一個MessageFormat類,用來格式化帶變量的文本 。"dsadsadas{2}fsfa{1}fsd{0}" 括號中的數字是一個占位符 ,可以用實際的名字和值來替換它 。使用靜態方法MessageFormat.format可以用實際的值來替換這些占位符。從JDK 5.0開始,它已經是一個“varargs”方法了,所以你可以通過下面的方法提供參數String string = MessageFormat.format("ewqe=={2}==as{0}==={1}", "aaa","bbbb","ccc"); System.out.println(string);//ewqe==ccc==asaaa===bbbb一般來說,占位符標記后面可以跟一個類型(type)和一個風格(style),它們之間用逗號隔開。類型可以是 number,time,date,choice。如果類型是number,那么風格可以是integer、currency、percent。或者可以是數字格式模式,就像$、##0。如果類型是time或date,那么風格可以是 short、medium、long、full。或者一個日期格式模版像yyyy-MM-dd。 靜態的MessageFormat.format方法使用當前的locale對值進行格式化。要想用任意的locale進行格式化,還有一些工作要做,因為這個類還沒有提供任何可以使用的“varargs”方法。你需要把將要格式化的值置于Object[]數組中,就像下面這樣
MessageFormat mf = new MessageFormat("{3}==={2}000{1}---{0}",new Locale("zh","CN")); String result = mf.format(new Object[]{"aaa","bbb","ccc","ddd"}); System.out.println(result);//ddd===ccc000bbb---aaaMessageFormatMessageFormat(String pattern)MessageFormat(String pattern, Locale loc)用給定的模式和locale構建一個消息格式對象。void applyPattern(String pattern)給消息格式對象設置特定的模式。void setLocale(Locale loc)Locale getLocale()設置或獲取消息中占位符所使用的locale。這個locale僅僅被通過調用applyPattern方法所設置的后續模式所使用。static String format(String pattern, Object... args)通過使用args[i]作為站位符{i}的輸入來格式化pattern字符串。StringBuffer format(Object args, StringBuffer result, FieldPosition pos)格式化MessageFormat的模式。 args參數必須是一個對象數組。被格式化的字符串會被附加到result末尾,并返回result。如果pos等于newFieldPosition(MessageFormat.Field.ARGUMENT),就用它的beginIndex和endIndex屬性值來設置替換占位符{1}的文本位置。如果不關心位置信息,可以將它設為null。一個選擇格式是由一個序列對,每一個對包括一個下限(lower limit)一個格式字符串(format string)。double[] limit = {0, 1};String[] format = {"Hello0", "Hello1{1}"};ChoiceFormat cf = new ChoiceFormat(limit, format);MessageFormat mf = new MessageFormat("{0}");mf.setFormatByArgumentIndex(0, cf);for (int i = 0; i < 2; ++i){ System.out.println(mf.format(new Object[]{new Integer(i), new Integer(i+1)}));}//Hello0/nHello12文本文件和字符集當把數據保存到一個文本文件中時,應該照顧到本地的字符編碼,這樣程序的用戶就可以用他們的其他程序打開這個文本文件。字符編碼是在FileWriter的構造器中指定的 。
FileWriter fw = new FileWriter(xxx,"UTF-8");源文件的字符編碼源文件:本地編碼類文件:modified UTF-8虛擬機:UTF-16 。為了使你的源文件能夠到處使用,必須使用通用的ASCII編碼。就是說,你需要將所有非A S C I I字符轉換成等價的Unicode編碼。定位資源包
需要對這些包使用一種統一的命名規則。例如,為德國定義的資源放在一個名為“包名_de_DE”的文件中,為所有說德語的國家所共享的資源放在名為“ 包名_de”的文件中。一般來說,使用包名_語言_國家來命名所有和國家相關的資源,使用包名_語言來命名所有和語言相關的資源。最后,作為后備,可以把默認資源放到一個沒有后綴的文件中。可以用下面的命令加載一個包
ResourceBundle rb = ResourceBundle.getBundle(bundleName,currentLocale);getBundle方法試圖加載符合當前locale定義的語言、國家和變量的包。如果失敗,通過依次放棄語言、變量和國家來繼續進行查找。同樣的查找被應用于默認的locale,最后,如果還不行的話就去查看默認的包文件,如果這也失敗了,方法拋出一個MissingResourceException異常。這就是說, getBundle方法試圖加載以下的包。包名_當前Locale的語言_當前Locale的國家_當前Locale的變量包名_當前Locale的語言_當前Locale的國家包名_當前Locale的語言包名_默認Locale的語言_默認Locale的國家_默認Locale的變量包名_默認Locale的語言_默認Locale的國家包名_默認Locale的語言包名 一旦getBundle方法定位了一個包,比如, 包名_de_DE,它還會繼續查找包名_de和包名。如果這些包也存在,它們在資源層次中就成為了包名_de_DE的父包。以后,當查找一個資源時,如果在當前包中沒有找到,就去查找其父包。就是說,如果一個特定的資源在當前包中沒有被找到。比如,某個特定資源在包名_de_DE中沒有找到,那么就會去查詢包名_de和包名。 屬性文件對字符串進行國際化是很直接的。你把所有字符串放到一個屬性文件中,比如abc.properties。這是一個每行存放一個鍵-值對的文本文件。命名你的屬性文件 abc.properties,abc_zh.properties等要查找一個特定的字符串,可以調用
String a = bundle.getString("name");存儲屬性的文件都是ASCII文件。包類為了提供字符串以外的資源,需要定義類,它擴展自ResourceBundle類。應該使用標準的命名規則來命名你的類,
abc.java,abc_zh.java當搜索包時,如果在類中的包和在屬性文件中的包中都存在匹配,優先選擇類中的包。實現資源綁定類的最簡單方法就是繼承ListResourceBundle類。ListResourceBundle讓你把所有資源都放到一個對象數組并提供查找功能。
public class abc_zh extends ListResourceBundle{ public Object[] getContents(){ return contents; } public static final Object[] contents={ {"name","xiaoming"}, {"age",12} }}或者,你的資源綁定類可以擴展ResourceBundle類。然后需要實現兩個方法,一是列出所有鍵,二是用給定的鍵查找相應的值Enumeration<String> getKeys();Object handleGetObject(String key);ResourceBundlestatic ResourceBundle getBundle(String baseName, Locale loc)static ResourceBundle getBundle(String baseName)在給定的locale或默認的locale下以給定的名字加載資源綁定類和它的父類。如果資源包類位于一個Java包中,那么類的名字必須包含完整的包名,例如“ intl.ProgramResources”。資源包類必須是public的,這樣getBundle方法才能訪問它們。Object getObject(String name)從資源包或它的父包中查找一個對象。String getString(String name)從資源包或它的父包中查找一個對象并把它轉型成字符串。String[] getStringArray(String name)從資源包或它的父包中查找一個對象并把它轉型成字符串數組。Enumeration<String> getKeys()返回一個枚舉對象,枚舉出資源包中的所有鍵,也包括父包中的鍵。Object handleGetObject(String key)如果你定義了自己的資源查找機制,這個方法需要被覆寫,用來查找與給定的鍵相關聯的資源的值。
新聞熱點
疑難解答