Java核心技术卷II(第8版) – 读书笔记 – 第5章

本章的内容是:国际化!

1、Java默认的UTF-8编码为国际化提供了可能。国际化不止是编码、文本,还包括日期、货币等方面。

2、Locale类表示一个地区(的国际化情况),它包括:一种语言、一个位置和一个变量。

如美国:language=English, location=United States

如果只指定了语言,有时候将无法处理货币、时间等。因为语言可能被多个公家共用,但各地的时间、货币表示符号又不同。

3、Java对于语言使用ISO标准的ISO-639-1,每个国家使用2字母的代号表示,想了解的猛击这里。注意中国是zh不是cn哦~

Java对于国家,使用ISO-3166-1,每个国家一般也是两个字母,但多数为大写,猛击这里,例如中国是CN。

4、java.util.Locale有两个参数的构造函数:

很明显第一个要写语言,如zh,第二个是国家,如CN

5、为了方便,Java预定义了上述Locale对象的常量:
如Locale.CHINA
Locale.US等,这些都是语言+位置(国家)。

也定义了只有语言没有位置的,如Locale.CHINESE,但这个不常用。

6、对于本机支持的所有Locale,可以列出:

我得机器结果如下:

7、Locale的各种Get方法就不赘述了,自己查JavaDoc吧。

8、单纯的Locale只是一个标示,而表现层(同样的数字,格式化为不同地区的货币),则是通过Fomartter完成的。

例如:java.text.NumberFormat提供了数字的解析和格式化。

格式化步骤:
(1)getXXXInstance()
(2)format完成从int/double到对应string的过程,如下:

9、 解析步骤:

例如从String中抽出人民币多少元:

10、NumberFormat可以通过set/getMax/MinIntegerDigit等设置最多多少位小数。

11、如上,NumberFormat.getCurrencyInstance()用于获取货币格式刷。

NumberFormat.getCurrency()返回货币符号,例如人民币的¥。

12、日期格式化是另外一个重头戏,通过java.text.DateFormat完成。

步骤也是类似的,先getXXXInstance(),然后format,不过参数是java.util.Date。

注意instance多了一个参数style,短、中、长。

例子如下:

13、其实更多的时候,我们想要自己控制日期输出,比如2012-03-01 13:33:33这种,这有两种方法,一是之前提到的format大法(见《Java格式化日期字符串》),另外就是通过SimpleDateFormat完成:

14、其实排序中也隐藏这国际化的风险,因为Java默认是用unicode排序的,这样很多顺序是错误的。。例如中文,我们习惯首字母拼音排序,而Java确实按照code的先后。。

这种排序需要java.util.Collator完成,同样也是用Locale获得当地的Collator,然后将它应用于sort时候就可以了~

下面的第二部分,就是按照首字母排序啦!

15、还可以设置“排序强度”,多语种时候比较有用,需要时候再了解吧。。

16、java.text.MessageFormat用于格式化文本。

它支持占位符,例如:”My name is {2}, work at {0}, my number is {1}”,然后后面可以用3个变量替代:

这个{}的格式是{idx, type, stype}。

idx就是下标。

type可以是number、time、date、choice。

如果number,则style可以是integer、currency、percent。如果time

如果time/date,style可以是short、medium、long、full或者模板yyyy-MM-dd等。

choice这种是用于a变成an这种小的根据实际语言的改变。

17、Java内部是UTF-8编码,但系统不一定是,文件更不一定是。

用其他编码打开文件:

 注意:文件编码名和Locale中定义的没有关联!!

18、.java文件的编码建议用ascii或者utf-8,如果有特殊字符,可以用naitive2ascii工具搞定。

19、本地化应用时,可能需要翻译大量的UI,此时我们可以用资源包搞定!

一个项目可以对应若干资源包

资源包命名为:

包名_语言_地区。例如:

Msg_de_DE

Msg_zh_CN

20、加载包:

第一个参数是包名,第二个是Locale

它将先尝试匹配语言、国家和变量。如果失败,放弃语言,根据国家查找,如果都失败就用默认的locale了。

21、对字符串进行包国际化很简单:

MyMsg_zh_CN.properties:

注意这些字符串文件必须是ascii编码的,如果你要中文需要用naive2ascii编译!

下面是一个编译好的例子:

需要加载字符串的时候:

22、如果对字符串之外的资源包,就需要扩展类了:

拓展ListResourceBundle

或者拓展ResourceBundle但是需要实现getKeys()和handleObject(String key)方法。

本章完毕。

 

One thought on “Java核心技术卷II(第8版) – 读书笔记 – 第5章

Leave a Reply

Your email address will not be published.