七、国际化
7.1 Locale 对象
-
locale 由5 个部分构成
-
一种语言,由2 个或3 个小写字母表示,例如en (英语)、de (德语)和z h (中文) 。
-
可选的一段脚本,由首字母大写的四个字母表示,例如Latn (拉丁文) 、Cyrl (西里尔文)和Hant (繁体中文字符) 。
-
可选的一个国家或地区,由2 个大写字母或3 个数字表示,例如US (美国)和CH(瑞士) 。
-
可选的一个变体,用于指定各种杂项特性,例如方言和拼写规则。变体现在已经很少使用了。过去曾经有一种挪威语的变体”尼诺斯克语”,但是它现在已经用另一种不同的代码nn 来表示了。过去曾经用千日本帝国历和泰语数字的变体现在也都被表示成了扩展。
-
可选的一个扩展。扩展描述了日历(例如日本历)和数字(替代西方数字的泰语数字)等内容的本地偏好。Unicode 标准规范了其中的某些扩展,这些扩展应该以u- 和两个字母代码开头,这两个字母的代码指定了该扩展处理的是日历( ca ) 还是数字( nu ) ,或者是其他内容。
-
-
locale 是用标签描述的,标签是由locale 的各个元素通过连字符连接起来的字符串,例如en-US 。
-
用标签字符串来构建Locale 对象
Locale usEnglish = Locale.forLanguageTag("en-US"); // tolanguageTag 方法可以生成给定Locale 的语言标签。
-
Java SE 为各个国家预定义了Locale 对象
Locale.CANADA Locale.CANADA_FRENCH Locale.CHINA Locale.FRANCE Locale.GERMANY Locale.ITALY Locale.JAPAN Locale.KOREA Locale.PRC Locale.TAIWAN Locale.UK Loeale.US
-
Java SE 还预定义了大量的语言Locale , 它们只设定了语言而没有设定位置
Locale.CHINESE Locale.ENGLISH Locale.FRENCH Loeale.GERMAN Locale.ITALIAN Locale.JAPANESE Locale.KOREAN Locale.SIMPLIFIED_CHINESE Locale.TRADITIONAL_CHINESE
-
静态的getAvailablelocale 方法会返回由Java 虚拟机所能够识别的所有Locale 构成的数组。
-
获得一个Locale 对象
-
构建一个Locale。
-
使用预定义的Locale。
-
Locale 类的静态getdefault 方法可以获得作为本地操作系统的一部分而存放的默认Locale。可以调用setDefault 来改变默认的Java Loe ale ;但是,这种改变只对你的程序有效,不会对操作系统产生影响。
-
对千所有与L ocale 相关的工具类, 可以返回一个它们所支持的Locale 数组。如下代码将返回所有DateFormat 类所能够处理的Locale 。
Locale[] supportedlocales = NumberFormat.getAvailableLocales();
-
-
如果你的用户已经选择了德语作为首选的语言,那么你可能希望将字符串显示成德语。通过将German Locale 作为参数传递就可以做到这一点:
Locale loc = new Locale("de", "CH") ; System.out.println(loc.getDisplayName(Locale.GERMAN)); // 代码将打印 Deutsch (Schweiz)
7.2 数字格式
- 数字和货币的格式是高度依赖千locale 的。
-
对特定Locale 的数字进行格式化。
- 使用上一节的方法,得到Locale 对象。
- 使用一个“工厂方法”得到一个格式器对象。
- 使用这个格式器对象来完成格式化和解析工作。
-
工厂方法是NumberFormat 类的静态方法,它们接受一个Locale 类型的参数。总共有3 个工厂方法:getNumberinstance 、getCurrencylnstance 和getPercentlnstance ,这些方法返回的对象可以分别对数字、货币量和百分比进行格式化和解析。
// 对德语中的货币值进行格式化。 Locale loc = Locale.GERMANY; NumberFormat currFmt = NumberFormat.getCurrencyInstance(loc); double amt = 123456.78; String result = currFmt.format(amt); // 123.456,78 €
由getX.xx lnstance 工厂方法返回的类并非是NumberFormat 类型的。NumberFormat 类型是一个抽象类,而我们实际上得到的格式器是它的一个子类。工厂方法只知道如何定位属于特定locale 的对象。
-
读取一个按照某个Locale 的惯用法而输入或存储的数字,那么就需要使用parse 方法。
Locale loc = Locale.GERMANY; NumberFormat currFmt = NumberFormat.getCurrencyInstance(loc); double amt = 123456.78; String result = currFmt.format(amt); // 解析货币字符串 Number number = currFmt.parse(result); // 上述方法返回的对象是一个Double 或Long 的包装器类对象,这取决于被解析的数字是否是浮点数。 // 数字文本的格式不正确,该方法会抛出一个ParseException // 123456.78
可以用静态的getAvailableLocales 方法得到一个当前所支持的Locale 对象列表。这个方法返回一个Locale 对象数组,从中可以获得针对它们的数字格式器对象。
7.3 货币
-
NumberFormat.getCurrencylnstance
方法的灵活性不好,它返回的是一个只针对一种货币的格式器。// 使用两种格式器 NumberFormat dollarFormatter = NumberFormat.getCurrencyInstance(Locale.US); NumberFormat euroFormatter = NumberFormat.getCurrencyInstance(Locale.GERMANY);
-
使用Currency 类来控制被格式器所处理的货币。可以通过将一个货币标识符传给静态Currency.getlnstance 方法来得到一个Currency 对象,然后对每一个格式器都调用setCurrency 方法。
// 为美国客户设置欧元的格式 NumberFormat euroFormatter = NumberFormat.getCurrencyInstance(Locale.GERMANY); euroFormatter.setCurrency(Currency.getInstance("EUR"));
-
货币标识符
7.4 日期和时间
-
当格式化日期和时间时, 需要考虑4 个与Locale 相关的问题。
- 月份和星期应该用本地语言来表示。
- 年月日的顺序要符合本地习惯。
- 公历可能不是本地首选的日期表示方法。
- 必须要考虑本地的时区。
-
java.time 包中的DateTimeFormatter 类可以处理这些问题。首先设置一种格式风格,然后获取一个格式器:
FormatStyle style = ...; // One of FormatStyle.SHORT, FormatStyle .MEDIUM , ... DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(style); DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(style); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(style); // or DateTimeFormatter.ofLocalizedDateTime (style1, style2)
-
这些格式器都会使用当前的Locale 。为了使用不同的Locale, 需要使用withlocale 方法
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(style).withLocale(locale); // 格式化LocalDate 、LocalDateTime 、LocalTime 和ZonedDateTime formatter.format(LocalDate.now()) // 解析字符串中的日期和时间使用Local Date 、LocalDateTime 、Local Time 和ZonedDateTime 的静态的parse方法 LocalTime time = LocalTime.parse("9:32 AM", formatter);
日期格式器可以解析不存在的日期,例如November 31, 它会将这种日期调整为给定月份的最后一天。
-
调用OayOfWeek和Month 枚举的getDisplayName 方法显示星期和月份的名字。
for (Month m : Month.values()) System.out.println(m.getDisplayName(textStyle, locale) + " ");
- 文本风格如下,其中 STANDALONE 版本用千格式化日期之外的显示。
星期的笫一天可以是星期六、星期日或星期一,这取决于Locale 。
// 获取星期的第一天 DayOfWeek first = WeekFields.of(locale).getFirstDayOfWeek();
7.5 排序和范化
-
为了获得Locale 敏感的比较符,可以调用静态的
Collator.getInstance
方法:Collator coll = Collator.getInstance(locale); words.sort(coll); // Collator implements Comparator<Object>
-
排序器有几个高级设置项。你可以设置排序器的强度以此来选择不同的排序行为。字符间的差别可以被分为首要的(primary) 、其次的(secondary) 和再次的(tertiary) 。例如,若将排序器的强度设置成Collator.PRIMARY , 那么排序器将只关注primary 级的差别。如果设置成Collator . SECONDARY , 排序器将把secondary 级的差别也考虑进去。如果强度被设置为Collator. IDENTICAL, 则不允许有任何差异。
-
如果强度被设置为Collator.IDENTICAL, 则不允许有任何差异。这种设置在与排序器的第二种具有相当技术性的设置,即分解模式( decomposition mode ),联合使用时, 就会显得非常有用。
-
Unicode 标准对字符串定义了四种范化形式(normalization form ): D 、KD 、C 和KC。在范化形式C中,重音符号总是组合的。在范化形式D中,重音字符被分解为基字符和组合重音符。范化形式KC 和KD 也会分解字符。
-
选择排序器所使用的范化程度
-
Collator.NO_DECOMPOSITION 表示不对字符串做任何范化,这个选项处理速度较快,但是对千以多种形式表示字符的文本就显得不适用了。
-
默认值Collator.CANONICAL_DECOMPOSITION 使用范化形式D, 这对千包含重音但不包含连字的文本是非常有用的形式。
-
最后是使用范化形式KD 的“完全分解"。
-
-
让排序器去多次分解一个字符串是很浪费的。如果一个字符串要和其他字符串进行多次比较,可以将分解的结果保存在一个排序键对象中。getCollationKey 方法返回一个CollationKey 对象,可以用它来进行更进一步的、更快速的比较操作。
String a = ...; CollationKey aKey = coll.getCollationKey(a); if(aKey.compareTo(coll.getCollationKey(b)) == 0) // fast comparison
-
在不需要进行排序时,将字符串转换成它们的范化形式。
String name = "Angstrom"; // uses normalization form D String normalized = Normalizer.normalize(name, Normalizer.Form.NFD);
7.6 消患格式化
-
格式化数字和日期
-
占位符格式化
// 不提供占位符格式 String msg = MessageFormat.format("On {2}, a {O} destroyed {1} houses and caused {3} of damage.", "hurricane", 99, new GregorianCalendar(1999, Calendar.FEBRUARY, 1).getTime(), 10.0E8); // 为占位符提供可选的格式 String msg = MessageFormat.format("On {2, date, long}, a {0} destroyed {1} houses and caused {3, number, currency} of damage .", "hurricane", 99, new GregorianCalendar(1999, Calendar.FEBRUARY, 1).getTime(), 10.0E8);
-
占位符索引后面可以跟一个类型( 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(pattern, loc); String msg = mf.format(new Object[] {values});
-
-
选择格式
-
choice 格式化选项,一个选择格式是由一个序列对构成的,每一个对包括以下两个方面,下限和格式字符串由一个#符号分隔,对与对之间由符号 | 分隔。
- 一个下限(lower limit)
- 一个格式字符串(format string)
-
例子
{1, choice, 0#no houses|1#one house|2#{1} houses}
当消息格式将选择的格式应用千占位符{1}而且替换值是2 时,那么选择格式会返回“{1} houses " 。这个字符串由消息格式再次格式化,并将这次的结果和上一次的叠加。
-
可以使用<符号来表示如果替换值严格小千下限,则选中这个选择项。也可以使用三(unicode 中的代码是 \u2264) 来实现和#相同的效果。如果愿意的话,甚至可以将第一个下限的值定义为 -oo (unicode 代码是 -\u221E ) 。
-oo<no houses|0<one house|2≤{1} houses // 使用转义符 -\u221E<no houses|0<one house|2\u2264{1} houses
-
将选择字符串放到原始消息字符串中
// 在英语中 String pattern = "On {2, date, 1 ong }. {O} destroyed {1,choice,0#no houses|1#one house|2#{1} houses} und caused {3,number,currency} of damage."; // 在德语中 String pattern = "{O} zerstorte am {2,date,long} {1,choice,0#kein Haus|1#ein Haus|2#{1} Hauser} und richtete einen Schaden von {3,number,currency} an. ";
-
7.7 文本文件和字符集
-
文本文件
-
当今,最好是使用UTF-8 来存储和加载文本文件,但是你需要操作遗留文件。如果你知\道遗留文件所希望使用的字符编码机制,那么可以在读写文本文件时指定它。
PrintWriter out= new PrintWriter (filename, "Windows-1252");
-
获得最佳的编码机制
Charset platformEncoding = Charset.defaultCharset();
-
-
行结束符
-
在Windows 中,文本文件希望在每行末尾使用 \r\n ,而基千UNIX 的系统只需要一个 \n 字符。与在字符串中使用\n 不同,可以使用printf 和%n 格式说明符来产生平台相关的行结束符。
out.printf("Hello%nWorld%n"); // 在Windows 上产生 Hello\nWorld\r\n // 在其他所有平台产生 Hello\nWorld\n
-
-
控制台
-
Charset.defaultCharset( )方法将返回Windows-1252 字符集。用户切换控制台的字符编码机制。
-
在Win dows 中,这可以通过chcp 命令实现。
- 命令
chcp 1252
将控制台变换为Windows-1252 编码页。 - 命令
chcp 65001
将控制台切换到UTF-8
- 命令
-
这种命令还不足以让Java 在控制台中使用UTF- 8, 我们还必须使用非官方的file . encoding 系统属性来设置平台的编码机制:
java -Dfile.encoding=UTF-8 MyProg
-
-
日志文件
-
当来自 java.util.logging 库的日志消息被发送到控制台时,它们会用控制台的编码机制来书写。文件中的日志消息会使用FileHandler 来处理,它在默认情况下会使用平台的编码机制。
-
要想将编码机制修改为UTF-8, 需要修改日志管理器的设置。具体做法是在日志配置文件中做如下设置:
java.util.logging.FileHandler.encoding=UTF-8
-
-
UTF-8 字节顺序标志
- 在文件中添加一个”字节顺序标志”字符U+FEFF 作为文件的第一个字符,是一种完全合法的做法。任何读入器都被认为会丢弃最前面的字节顺序标志。
-
源文件的字符编码
-
程序编译和运行时,依然有3 种字符编码参与其中:
- 源文件:本地编码
- 类文件: modified UTF-8
- 虚拟机: UTF-16
你可以用 -encoding 标记来设定你的冲文件的宇符编码,
javac -encoding UTF-8 Myfile.java
-
为了使你的源文件能够到处使用,必须使用普通的ASCII 编码。就是说,你需要将所有非ASCII 字符转换成等价的Unicode 编码。
-
JDK 包含一个工具一native2ascii , 可以用它来将本地字符编码转换成普通的ASCII。这个工具直接将输入中的每一个非ASCII 字符替换为一个 \u 加四位十六进制数字的Unicode 值。
// 使用native2ascii native2ascii Myfile.java Myfile.temp // 用 -reverse 选项来进行逆向转换 native2ascii -reverse Myfile.temp Myfile.java // 用 -encoding 选项指定另一种编码 native2ascii -encoding UTF-8 Myfile.java Myfile.temp
-
7.8 资源包
-
定位资源包
-
使用 包名_ 语言_国家 来命名所有和国家相关的资源,使用 包名_语言 来命名所有和语言相关的资源。最后,作为后备,可以把默认资源放到一个没有后缀的文件中。
ResourceBundle currentResources = ResourceBundle.getBundle(bundleName, currentLocale);
-
getBundle 方法试图加载匹配当前locale 定义的语言和国家的包。如果失败,通过依次放弃国家和语言来继续进行查找,然后同样的查找被应用于默认的locale, 最后,如果还不行的话就去查看默认的包文件,如果这也失败了,则抛出一个MissingResourceException 异常。
-
getBundle 方法会试图加载以下的包。
- 包名_当前Locale 的语言_ 当前Locale 的国家_ 当前Locale 的变量
- 包名_当前L ocale 的语言_ 当前Locale 的国家
- 包名_当前Locale 的语言
- 包名_ 默认Locale 的语言_ 默认Locale 的国家_ 默认Locale 的变量
- 包名_ 默认Locale 的语言_默认Locale 的国家
- 包名_ 默认Locale 的语言
- 包名
当搜索包时,如果在类中的包和在属性文件中的包中都存在匹配,优先选择类中的包。
-
-
属性文件
-
对字符串进行国际化是很直接的,你可以把所有字符串放到一个属性文件中,如 Strings.properties。
// 国际化命名你的属性文件 Strings.properties Strings_en.properties Strings_de_DE.properties // 加载包 ResourceBundle currentResources = ResourceBundle.getBundle("Strings", locale);
-
-
包类
-
为了提供字符串以外的资源,需要定义类,它必需扩展自ResourceBundle 类。应该使用标准的命名规则来命名你的类
MyProgramResources.java MyProgramResources_en.java MyProgramResources_de_DE.java // 以使用与加载属性文件相同的getBundle 方法来加载这个类: ResourceBundle currentResources = ResourceBundle.getBundle("MyProgramResources", locale);
-
实现资源包类的最简单方法就是继承ListResourceBundle 类。ListResourceBundle让你把所有资源都放到一个对象数组中并提供查找功能。
// 实现框架 public class bundleName_language_country extends ListResourceBundle { private static final Object[][] contents = { {key1,value1}, {key2,value2}, ... }; @Override protected Object[][] getContents() { return contents; } } // 实例 public class ProgramResources_de extends ListResourceBundle { private static final Object[][] contents = { {"backgroundColor", Color.black}, {"defaultPaperSize", new double[]{210, 297}}, }; @Override protected Object[][] getContents() { return contents; } } public class ProgramResources_en_US extends ListResourceBundle { private static final Object[][] contents = { {"backgroundColor", Color.black}, {"defaultPaperSize", new double[]{216, 279}}, }; @Override protected Object[][] getContents() { return contents; } }
-
或者资源包类可以扩展ResourceBundle 类。然后需要实现两个方法, 一是枚举所有键,二是用给定的键查找相应的值:
Enumeration<String> getKeys() Object handleGetObject(String key)
ResourceBundle 类的getObject 方法会调用你提供的handleGetObject 方法。
-
7.9 一个完整的例子(P338)
API注释
7.1 Locale 对象
iava.utll.Locale 1.1
Locale(String language)
Locale(String language, String country)
Loeale(String language, String country, String variant)
// 用给定的语言、国家和变量创建一个Locale 。在新代码中不要使用变体,应该使用 IETF B CP47 语言标签。
static LoealeforlanguageTag(String l anguageTag) 7
// 构建与给定的语言标签相对应的Locale 对象。
static LocalegetDefault()
// 返回默认的Locale 。
static void setDefault(Locale loc)
// 设定默认的Locale 。
String getDisplayName()
// 返回一个在当前的Locale 中所表示的用来描述Locale 的名字。
String getDisplayName(Locale loc)
// 返回一个在给定的Locale 中所表示的用来描述Locale 的名字。
String getlanguage()
// 返回语言代码,它是两个小写字母组成的IS0-639 代码。
String getDisplayLanguage()
// 返回在当前Locale 中所表示的语言名称。
String getDisplaylanguage(Locale loc)
// 返回在给定Locale 中所表示的语言名称。
String getCountry()
// 返回国家代码,它是由两个大写字母组成的I S0- 3166 代码。
String getDisplayCountry()
// 返回在当前Locale 中所表示的国家名。
String getDisplayCountry(Locale loc)
// 返回在当前Locale 中所表示的国家名。
String tolanguageTag() 7
// 返回该Locale 对象的语言标签,例如“ de-CH” 。
String toString()
// 返回Locale 的描述,包括语言和国家,用下划线分隔(比如, “de_CH”) 应该只在调试时使用该方法。
7.2 数字格式
java.text.NumberFormat 1.1
static Locale[] getAvailablelocales()
// 返回一个Locale 对象的数组,其成员包含有可用的NumberFormat 格式器。
static NumberFormat getNumberlnstance()
static NumberFormat getNumberlnstance(Locale l)
static NumberFormat getCurrencylnstance()
static NumberFormat getCurrencylnstance(Locale l)
static NumberFormat getPercentlnstance()
static NumberFormat getPercentlnstance(Locale l)
// 为当前的或给定的locale 提供处理数字、货币量或百分比的格式器。
String format(double x)
String format(long x)
// 对给定的浮点数或整数进行格式化并以字符串的形式返回结果。
Number parse(String s)
// 解析给定的字符串并返回数字值,如果输入字符串描述了一个浮点数,返回类型就是Double, 否则返回类型就是Long 。字符串必须以一个数字开头;以空白字符开头是不允许的。数字之后可以跟随其他字符,但它们都将被忽略。解析失败时抛出ParseException 异常。
void setParselntegerOnly(boolean b)
boolean isParselntegerOnly()
// 设置或获取一个标志,该标志指示这个格式器是否应该只解析整数值。
void setGroupingUsed(boolean b)
boolean isGroupingUsed()
// 设置或获取一个标志,该标志指示这个格式器是否会添加和识别十进制分隔符(比如,100 000 ) 。
void setMinimumlntegerDigits(int n)
int getMinimumlntegerDigits()
void setMaximumlntegerDigits(int n)
int getMaximumlntegerDigits()
void setMinimumFractionDigits(int n)
int getMinimumFractionDigits()
void setMaximumFractionDigits(int n)
int getMaximumFractionDigits()
// 设置或获取整数或小数部分所允许的最大或最小位数。
7.3 货币
java.utii.Currency 1.4
static Currency getlnstance(String currencyCode)
static Currency getlnstance(Locale locale)
// 返回与给定的ISO 4217 货币代号或给定的Locale 中的国家相对应的Curreny 对象。
String toString()
String getCurrencyCode()
// 获取该货币的ISO 4217 代码。
String getSymbol()
String getSymbol(Locale locale)
// 根据默认或给定的Locale 得到该货币的格式化符号。比如美元的格式化符号可能是“$”或“US$" ,具体是哪种形式取决于Locale 。
int getDefaultFractionDigits()
// 获取该货币小数点后的默认位数。
static Set<Currency> getAvailableCurrencies() 7
// 获取所有可用的货币。
7.4 日期和时间
java.time.format.DateTimeFormatter 8
static DateTimeFormatter oflocalizedDate(FormatStyle dateStyle)
static DateTimeFormatter oflocalizedTime(FormatStyle dateStyle)
static DateTimeFormatter oflocalizedDateTime(FormatStyle dateTimeStyle)
static DateTimeFormatter ofLoealizedDate(FormatStyle dateStyle, FormatStyle timeStyle)
// 返回用指定的风格格式化日期、时间或日期和时间的DateTimeFormatter 实例。
DateTimeFormatter withlocale(Locale locale)
// 返回当前格式器的具有给定Locale 的副本。
String format(TemporalAccessor temporal)
// 返回格式化给定日期/时间所产生的字符串。
java.time.LocalDate 8
java.time.LocalTime 8
java.time.LocalDateTime 8
java.time.ZonedDateTime 8
static Xxx parse(CharSequence text, DateTimeFormatter formatter)
// 解析给定的字符串并返回其中描述的LocalDate 、LocalTime 、LocalDateTime 或 ZonedDateTime 。如果解析不成功,则抛出DateTimeParseException 异常。
7.5 排序和范化
java.text.Collator 1.1
static Locale[] getAvailablelocales()
// 返回Locale 对象的一个数组,该Collator 对象可用千这些对象。
static Collator getlnstance()
static Collator getlnstance(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()
// 设置或获取排序器的分解模式。分解越细,判断两个字符串是否相等时就越严格。分解的等级值可以是C ollator . NO_DECOMPOSITION 、Collator .CANONICAL_DECOMPOSITION 和Collator . FULL_DECOMPOSITION 。
CollationKey getCollationKey(String a)
// 返回一个排序器键,这个键包含一个对一组字符按特定格式分解的结果,可以快速地和其他排序器键进行比较。
java.text.CollationKey 1.1
int compareTo(CollationKey b)
// 如果这个键在b 之前,则返回一个负值;如果两者等价,则返回0, 否则返回正值。
java.text.Normalizer 6
static String normalize(CharSequence src, Normalizer.Form form)
// 返回str的范化形式,form 的值是ND 、NKD 、NC 或NKC 之一。
7.6.1 格式化数字和日期
java.text. MeessageFormat 1.1
MessageFormat(String pattern)
MessageFormat(String pattern, Locale loc)
// 用给定的模式和local e 构建一个消息格式对象。
void applyPattern(String pattern)
// 给消息格式对象设置特定的模式。
void setlocale(Locale loc)
Locale getlocale()
// 设置或获取消息中占位符所使用的l ocale 。这个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 等千new FieldPosition(MessageFormat.Field . ARGUMENT),就用它的begin Index 和endlndex 属性值来设置替换占位符{1} 的文本位置。如果不关心位置信息,可以将它设为null 。
java.text. Format 1.1
String format(Object obj)
// 按照格式器的规则格式化给定的对象,这个方法将调用format(obj, new StringBuffer(), new FieldPosition(1)).toString() 。
7.8.3 包类
java.util.ResourceBundte 1 .1
static 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 handl eGetObject(String key)
// 如果你要定义自己的资源查找机制,那么这个方法就需要被覆写,用来查找与给定的键相关联的资源的值。
评论区