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

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

比較消息格式化資源包等

2019-11-11 00:23:59
字體:
供稿:網(wǎng)友

      一般先得到一個Locale對象,然后,調(diào)用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類實現(xiàn)了Comparator接口。因此,可以傳一個排序器對象到Collections.sort方法中來對一組字符串進行排序 。

排序強度

      你可以設(shè)置排序器的強度來選擇不同的排序行為。字符間的差別可以被分為首要的(primary)、 其次的(secondary)和再次的( tertiary)。比如,在英語中, “A”和“Z”之間的差別被歸為首要的,而“A”和“?”之間的差別是其次的, “A”和“a”之間是再次的。如果將排序器的強度設(shè)置成Collator.PRIMARY,那么排序器將只關(guān)注primary級的差別。如果設(shè)置成Collator.SECONDARY,排序器將把secondary級的差別也考慮進去。就是說,兩個字符串在“secondary”或“tertiary”強度下更容易被區(qū)分開來,如表5-4所示。如果強度被設(shè)置為Collator.IDENTICAL,則不允許有任何差異。這種設(shè)置在與排序器的第二種相當技術(shù)性的設(shè)置,即分解模式(decomposition mode),聯(lián)合使用時,就會顯得非常有用。 

分解

       Unicode標準對字符串定義了四種范化形式(normalization form):D、KD、C和KC 。這其中的兩種都是用于排序的。在范化形式D中,重音字符被分解為基字符和組合重音符。例如,?就被轉(zhuǎn)換成由字母A和上方組合環(huán)°構(gòu)成的序列。范化形式KD更近一步地將兼容性字符(compatibility character)也進行了分解,例如ffi連字或商標符號TM 。

       我們可以選擇排序器所使用的范化程度:Collator.NO_DECOMPOSITION表示不對字符串做任何范化,這個選項處理速度較快,但是對于以多種形式表示字符的文本就顯得不適用了;默認值Collator.CANONICAL_DECOMPOSITION使用范化形式D,這對于包含重音但不包含連字的文本是非常有用的形式;最后是使用范化形式KD的“完全分解”。

       讓排序器去多次分解一個字符串是很浪費的。如果一個字符串要和其他字符串進行多次比較,可以 將 分 解 的 結(jié) 果 保 存 在 一 個 排 序 鍵 對 象 中 。getCollationKey方法返回一個CollationKey對象,可以用它來進行更深入的、更快速的比較操作。

Collator collator = Collator.getInstance(aLocale);		String aString ="";		CollationKey cKey = collator.getCollationKey(aString);		if(cKey.compareTo(collator.getCollationKey(new String("")))==0){					}        最后,有可能在你不需要進行排序時,也希望將字符串轉(zhuǎn)換成它們的范化形式。例如,在將字符串存儲到數(shù)據(jù)庫中,或與其他程序進行通信時。從java SE 6.0開始,java.text.Normalizer類實現(xiàn)了對范化的處理。
		String aString ="??cvsz";		String bString = Normalizer.normalize(aString, Normalizer.Form.NFKD);
Collatorstatic Locale[] getAvailableLocales()返回Locale對象的一個數(shù)組,通過它可以得到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()設(shè)置或獲取排序器的強度。更強的排序器可以區(qū)分更多的詞。強度的值可以是Collator.PRIMARY、 Collator.SECONDARY和Collator.TERTIARY。void setDecomposition(int decomp)int getDecompositon()設(shè)置或獲取排序器的分解模式。分解越細,判斷兩個字符串是否相等時就越嚴格。分解的等級值可以是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}"        括號中的數(shù)字是一個占位符 ,可以用實際的名字和值來替換它 。使用靜態(tài)方法MessageFormat.format可以用實際的值來替換這些占位符。從JDK 5.0開始,它已經(jīng)是一個“varargs”方法了,所以你可以通過下面的方法提供參數(shù) 

		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。或者可以是數(shù)字格式模式,就像$、##0。如果類型是time或date,那么風格可以是 short、medium、long、full?;蛘咭粋€日期格式模版像yyyy-MM-dd。        靜態(tài)的MessageFormat.format方法使用當前的locale對值進行格式化。要想用任意的locale進行格式化,還有一些工作要做,因為這個類還沒有提供任何可以使用的“varargs”方法。你需要把將要格式化的值置于Object[]數(shù)組中,就像下面這樣 

		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---aaa
MessageFormatMessageFormat(String pattern)MessageFormat(String pattern, Locale loc)用給定的模式和locale構(gòu)建一個消息格式對象。void applyPattern(String pattern)給消息格式對象設(shè)置特定的模式。void setLocale(Locale loc)Locale getLocale()設(shè)置或獲取消息中占位符所使用的locale。這個locale僅僅被通過調(diào)用applyPattern方法所設(shè)置的后續(xù)模式所使用。static String format(String pattern, Object... args)通過使用args[i]作為站位符{i}的輸入來格式化pattern字符串。StringBuffer format(Object args, StringBuffer result, FieldPosition pos)格式化MessageFormat的模式。 args參數(shù)必須是一個對象數(shù)組。被格式化的字符串會被附加到result末尾,并返回result。如果pos等于newFieldPosition(MessageFormat.Field.ARGUMENT),就用它的beginIndex和endIndex屬性值來設(shè)置替換占位符{1}的文本位置。如果不關(guān)心位置信息,可以將它設(shè)為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文本文件和字符集

        當把數(shù)據(jù)保存到一個文本文件中時,應(yīng)該照顧到本地的字符編碼,這樣程序的用戶就可以用他們的其他程序打開這個文本文件。字符編碼是在FileWriter的構(gòu)造器中指定的 。

FileWriter fw = new FileWriter(xxx,"UTF-8");源文件的字符編碼源文件:本地編碼類文件:modified UTF-8虛擬機:UTF-16 。為了使你的源文件能夠到處使用,必須使用通用的ASCII編碼。就是說,你需要將所有非A S C I I字符轉(zhuǎn)換成等價的Unicode編碼。  

定位資源包

        需要對這些包使用一種統(tǒng)一的命名規(guī)則。例如,為德國定義的資源放在一個名為“包名_de_DE”的文件中,為所有說德語的國家所共享的資源放在名為“ 包名_de”的文件中。一般來說,使用包名_語言_國家來命名所有和國家相關(guān)的資源,使用包名_語言來命名所有和語言相關(guān)的資源。最后,作為后備,可以把默認資源放到一個沒有后綴的文件中??梢杂孟旅娴拿罴虞d一個包 

ResourceBundle rb = ResourceBundle.getBundle(bundleName,currentLocale);getBundle方法試圖加載符合當前l(fā)ocale定義的語言、國家和變量的包。如果失敗,通過依次放棄語言、變量和國家來繼續(xù)進行查找。同樣的查找被應(yīng)用于默認的locale,最后,如果還不行的話就去查看默認的包文件,如果這也失敗了,方法拋出一個MissingResourceException異常。這就是說, getBundle方法試圖加載以下的包。包名_當前Locale的語言_當前Locale的國家_當前Locale的變量包名_當前Locale的語言_當前Locale的國家包名_當前Locale的語言包名_默認Locale的語言_默認Locale的國家_默認Locale的變量包名_默認Locale的語言_默認Locale的國家包名_默認Locale的語言包名         一旦getBundle方法定位了一個包,比如, 包名_de_DE,它還會繼續(xù)查找包名_de和包名。如果這些包也存在,它們在資源層次中就成為了包名_de_DE的父包。以后,當查找一個資源時,如果在當前包中沒有找到,就去查找其父包。就是說,如果一個特定的資源在當前包中沒有被找到。比如,某個特定資源在包名_de_DE中沒有找到,那么就會去查詢包名_de和包名。 屬性文件

        對字符串進行國際化是很直接的。你把所有字符串放到一個屬性文件中,比如abc.properties。這是一個每行存放一個鍵-值對的文本文件。命名你的屬性文件 abc.properties,abc_zh.properties等要查找一個特定的字符串,可以調(diào)用

String a = bundle.getString("name");存儲屬性的文件都是ASCII文件。包類

為了提供字符串以外的資源,需要定義類,它擴展自ResourceBundle類。應(yīng)該使用標準的命名規(guī)則來命名你的類,

abc.java,abc_zh.java當搜索包時,如果在類中的包和在屬性文件中的包中都存在匹配,優(yōu)先選擇類中的包。實現(xiàn)資源綁定類的最簡單方法就是繼承ListResourceBundle類。ListResourceBundle讓你把所有資源都放到一個對象數(shù)組并提供查找功能。

public class abc_zh extends ListResourceBundle{	public Object[] getContents(){		return contents;	}	public static final Object[] contents={		{"name","xiaoming"},		{"age",12}	}}或者,你的資源綁定類可以擴展ResourceBundle類。然后需要實現(xiàn)兩個方法,一是列出所有鍵,二是用給定的鍵查找相應(yīng)的值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)從資源包或它的父包中查找一個對象并把它轉(zhuǎn)型成字符串。String[] getStringArray(String name)從資源包或它的父包中查找一個對象并把它轉(zhuǎn)型成字符串數(shù)組。Enumeration<String> getKeys()返回一個枚舉對象,枚舉出資源包中的所有鍵,也包括父包中的鍵。Object handleGetObject(String key)如果你定義了自己的資源查找機制,這個方法需要被覆寫,用來查找與給定的鍵相關(guān)聯(lián)的資源的值。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 监利县| 公主岭市| 武邑县| 和龙市| 沁源县| 夹江县| 文水县| 鄂伦春自治旗| 萝北县| 保定市| 繁昌县| 萨嘎县| 大兴区| 旌德县| 江源县| 平果县| 亳州市| 阳曲县| 南漳县| 多伦县| 双流县| 准格尔旗| 五华县| 东丰县| 资源县| 台东县| 德庆县| 葵青区| 隆化县| 屯门区| 固原市| 隆林| 白朗县| 龙海市| 五寨县| 应用必备| 会东县| 临城县| 阜阳市| 公安县| 阜阳市|