Java核心编程十二:国际化


国际化并不简单的是Unicode编码,它涉及到一系列复杂的相关表示。如数字、时间、货币显示等。
1 Locale
Locale用来存储语言和区域信息。它描述了一种语言、一个国家/地区,一个变量。
语言采用ISO-639标准来描述,它用两个小写字母标识一种语言,如Chinese的代码为zh。国家采用ISO-3166来描述,它用两个大写字母标识一个国家,如China的代码为CN。
这样区分就可以支持一个地区讲不同的语言,也支持不同的地区讲相同的语言。
Locale定义大量的常量地区对象和语言对象,以方便使用。
util.Locale类方法:
Locale(String language,String coutry,String variant) 创建函数
static Locale getDefault()  获取系统的默认Locale
static void  setDefault(locale) 设置默认的Locale,只影响本程序,不影响系统其他程序。
static Locals[] getAvailableLocales() 获得系统支持的locale数组。
String getDisplayName()  获取人类可读的友好名称
String getCountry() 获取国家编码
String getDisplayCountry() 获取国家可读的名称
String getLanguage()/getDisplayLanguage() 获取语言代码/名称

2 数字格式
在国际化的程序中,需要考虑对计量数字、货币值、百分数的格式化。通过java.text.NumberFormat类提供了获取相应的格式化器的方法
java.text.NumberFormat是一个抽象类,下面的几个方法返回不同的子类。
static NumberFormat getCurrencyInstance() 返回当前默认Locale的货币格式化器,也可以传递指定的locale参数
static NumberFormat getNumberInstance() 返回当前默认Locale的数字格式化器,也可以传递指定的locale参数
static NumberFormat getPercentInstance() 返回当前默认Locale的百分比格式化器,也可以传递指定的locale参数
static NumberFormat getInstance() 返回当前默认Locale的通用格式化器,也可以传递指定的locale参数
String format(Number o)  将指定数字进行格式化
Number parse(String s)   从输入字符串中解析出数字
void setCurrency(Currency c)  为格式化器设置货币,会取代其默认的货币格式。这样可以为诸如美国用户的中国货物进行表示。如果区域和货币类型一致,货币是"符号+值"来显示,如¥123。如果二者不匹配,则货币会以"货币代码+值"来表示,如CNY123。

java.util.Currency类代表货币的抽象
static Currecny getInstance(String code) 由货币代码生成,ISO4217定义,如CNY表示中国货币
static Currency getInstance(Locale lo)
String getCurrencyCode()  获取货币代码
String getSymbol(Locale locale)  获取货币符号,如$


3 日期与时间
在格式化日期时需要考虑,月份和星期的本地表示、年月日的顺序问题、时区位置。
java.text.DateFormat类提供了格式化日期和时间的方法
以下几个工厂根据不同的style来返回格式化器,style有short,long,full等。
static DateFormat getDateInstance(int dateStyle,Local default=null)
static DateFormat getTimeInstance(int dateStyle,Local default=null)
static DateFormat getDateTimeInstance(int dateStyle,int timeStyle,Local default=null)

Date parse(String s)  从字符串中解析出一个日期
void setCalendar(Calendar cal)   设置一个日历给格式化器
Calendar getCalendar() 获取当前的日历
void setTimeZone(TimeZone tz)
TimeZone getTimeZone()

java.util.TimeZone类:
String[]  getAvailableIDs() 获取所有支持时间列表
static String getDefault()  获取默认时区
bool useDaylightTime()      是否使用夏令时

4 字符排序
Java语言中的compareTo()方法使用Unicode来决定顺序。不同国家的人对排序有不同的需求,不仅仅是ASCII码字母排序那么单纯。text包中的Collator类可以帮我们解决这个问题,它执行基于Locale的字符比较。
static Collator getInstance(Locale lo) 获得指定区域的比较器
int compare(object o1,object o2)
void setStrenth(int level) 设置排序的比较强度。主要有PRIMARY,SECONDARY,TERTIARY。每一级都是基于前一级的增强。强度主要用来指示两个字符串是否被认为相等。例如Primary下A和a的表示形式(加重音等)是相同的。而在Secondary的层次上,才考虑不同表现形式的差异,但不考虑大小写。在TERIARY层次上,才区分大小写的区别。下图是一个示例,展示了在不同强度下的一组字符串的排序。

void setDecomposition(int) 是否进行分解,分解进行的越细,判断两个字符串是否相等就越严格。分解可以将字符和其重音分开,完全分解可以将全角字符后的空格分开。如"ABC"和"ABC"在不分解和半分解时不相等,而在全分解时相等。

CollationKey getCollationKey(String s) 对字符串分析并按键值保存分解结果,供后续使用。返回的值集包含一个compareTo(CollationKey )的方法,可以和其他结果集比较。

5 消息格式化
MessageFormat类提供了对字符串进行格式化的能力。
format("{0},{1,date,short},{2,number,currency}",args...) 其中{}中的占位符将被后面的参数所替换,同时占位可以被类型和风格来增加描述。
类型有number,time,date,choice。针对不同的类型有不同的风格,对于number有integer/currency/percent风格;对于date和time,有long,short,full等风格。
使用choice可以支持灵活的选择策略,其格式为 下限#内容并且用|分隔多个选项。
format("{0,choice,0#no hource|1#one hource|2#{0} hources} is destoryed by earchquake",number);

6 文本文件与字符集
Java的源文件保存在系统中,通常以系统默认字符编码进行保存,这样不具有可移植性。而编译后的class文件,则是UTF8编码的,但在JVM中,则以UTF16格式。
这样要求java源文件只能使用ASCII字符集,非ASCII的字符需要转换为\uxxxx的格式,这样才可以移植。通过native2ascii工具可以进行文件字符集的映射转换。


7 资源包



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值