24软件本地化(精)
工厂方法返回一个格式化器对象,可以用它的format方 法对日期进行格式化:
– Date now=new Date(); – String s=fmt. format(now);
12
中关村国际软件人才教育联盟
日期与时间 3-3
可以使用DateFormat类的parse方法来分析用 户键入的日期。下面代码分析用户在文本框中 键入的值:
7
中关村国际软件人才教育联盟
数字与货币 2-1
数字与货币的格式化与locale是息息相关的。你可使用下 面的步骤,对特定locale的数字进行格式化:
– 首先获得一个特定的locale对象 – 使用一个工厂方法获得一个格式化器对象 – 用格式化器对象对数字进行格式化
工厂方法是“格式化ห้องสมุดไป่ตู้”java.text.NumberFormat类 的静态方法,带有一个Locale类型的参数。工厂方法共 有3个:
13
中关村国际软件人才教育联盟
日期本地化示例
程序代码详见DateFormatTest.java, 程序输出结果如下:
14
中关村国际软件人才教育联盟
字符集 4-1
Java语言本身是完全支持Unicode编码的语言 Unicode字符集是对世界上所有的语言进行了 统一编码的字符集。 Unicode标准完全符合国 际标准ISO/IEC10646:2003,信息技术- -统一多字节编码字符集(UCS) UCS--Universal Mutiple-Octet Coded Character Set 或者: UCS-- Universal Character Set 目前,locale与字符集之间并没有什么联系
在Java中,不同语言字符集之间的转换是通过 Unicode字符集来实现的:
– 假设有两种不同的语言A和B,转换的步骤为:先把A转化为 Unicode,再把Unicode转化为B – 当映射不成功时( A 中有的Unicode 中没有,或者 Unicode中有的B中没有),就会发生问题。这就是屏幕显 示“?”号的由来
– 数字与货币的本地化 – 日期与时间的本地化 – 文本的本地化 – 图形用户界面的本地化 – 资源包
3
中关村国际软件人才教育联盟
Locale 4-1
在Java程序中,软件本地化离不开Locale对象的 支持 Locale对象可以用来描述下面几个元素:
– – – – – – 语言 国家 变形(可选) 例如: 在美国,使用的locale为:语言=英语,国家=美国 在中国,使用的locale为:语言=汉语,国家=中国
– UTF-32:使用32位的编码单元对Unicode字符进 行编码,它是固定宽度的编码 – UTF-16:使用16位的编码单元对Unicode字符进 行编码,在绝大多数情况下,它也是固定宽度的编 码 – UTF-8:使用8位的编码单元对Unicode字符进行 编码,它是可变宽度的编码:一个字符可能用1个、 2个、3个或4个字节来表示
16
中关村国际软件人才教育联盟
字符集 4-3
Unicode与UTF的关系:
– 在JAVA程序中,可以这样来理解Unicode与 UTF的关系:字符串在内存中运行时,表现 为Unicode代码,而当要保存到文件或其它 介质中去时,使用的是UTF。这个转化过程 是由OutputStream的writeUTF方法和 InputStream的readUTF来完成的
19
中关村国际软件人才教育联盟
字符集转换 3-2
程序处在编译和运行的时候,需要涉及下面3种字符 编码:
– 源文件(.java):使用本地编码 – 类文件(.class):使用UTF编码 – 虚拟机(JVM):使用Unicode编码
源文件一般是不可移植的,因为它们使用了本地字 符编码。若要使源文件可移植,应严格使用无格式 的ASCII编码:即把源文件中的所有非ASCII字符改 为它们的等价Unicode编码 JDK包含一个实用程序,native2ascii,可以用来 将本地字符编码转换为无格式的ASCII:
9
中关村国际软件人才教育联盟
数字本地化示例
程序代码详见NumberFormatTest.java, 程序输出结果如下:
10
中关村国际软件人才教育联盟
日期与时间 3-1
当你对日期和时间进行格式化时,下面这4个与locale 相关的问题是必须考虑的:
– – – – 月份和周、日的名字应该使用本地语言来表示 年、月、日的排列顺序应该以本地为首选方式 公历可能并不是本地首选的日期表示方法 必须考虑所在地点(国家)的时区 首先,你需要得到一个locale 然后,调用以下3个工厂方法中的一个: fmt=DateFormat. getDateInstance(dateStyle, loc); fmt=DateFormat. getTimeInstance(timeStyle, loc); fmt=DateFormat. getDateTimeInstance(dateStyle, timeStyle, loc);
– Local.CHINA – Local.JAPAN Local.KOREA
Local.JAPANESE Local.ENGLISH
6
JDK也预定义了一些语言Locale对象。如:
– Local.CHINESE – Local. KOREAN
中关村国际软件人才教育联盟
Locale 4-4
17
中关村国际软件人才教育联盟
字符集 4-4
在JDK中,与中文相关的字符集有 :
字符集名称
ASCII
ISO8859-1 GB2312
说明
7位编码
8位编码,西欧字符集。又叫ANSI 16位编码,汉字字符集
GBK
UTF-8 GB18030
兼容GB2312 ,所有字符可以一一 映射到Unicode 2.0字符集 Unicode字符集
– Locale usEnglish=new Locale(“en”,”US”); 或者只给定语言而不给定国家: – Locale jap=new Locale(“ja”,””); – 这种类型的Locale只能用来查找相关的语言,不能用来确定当地 的货币和日期的格式化方式
为了方便,JDK预定义了许多Locale对象。如:
11
Java的java.text.DateFormat类将负责处理这些问题:
– – – – –
中关村国际软件人才教育联盟
日期与时间 3-2
上述工厂方法的参数dateStyle和timeStyle的值是下列 常量之一:
– DateFormat.DEFAULT – DateFormat.FULL //比如,按照美国的locale,它的日期时间 格式为Thursday,September 18,2005 8:42:46 o’clock A.M.PDT – DateFormat.LONG – DateFormat.MEDIUM – DateFormat.SHORT //比如,按照美国的locale,它的日期时 间格式为9/18/05 8:42 A.M.
8
中关村国际软件人才教育联盟
数字与货币 2-2
对德语中的货币值进行格式化的例子:
– Locale loc=new Locale(“de”,”DE”); – NumberFormat currFmt= NumberFormat. getCurrencyInstance(loc); – double amt=123456.78; – System.out.println(currFmt.fromat(amt)); – 输出结果: – 123.456,78 DM //它的货币符号是DM
语言 Chinese English Japanese Korean
编码 zh en ja ko
国家 China United States Japan Korea
编码 CN US JP KR
5
中关村国际软件人才教育联盟
Locale 4-3
建立一个Locale对象:将语言、国家编码作为参数传递 给Locale类的构造函数:
– getNumberInstance //返回的对象能够对数字进行格式化 – getCurrencyInstance //返回的对象能够对货币量进行格式化 – getPercentInstance //返回的对象能够对百分比进行格式化
NumberFormat类的静态方法getAvailableLocales可 以返回一个系统当前支持的locale的数组
如果你想读取一个按照某个locale的约定输入的数字,使用parse方 法,该方法自动使用默认的locale:
– – – – – TextField inField; …… NumberFormat fmt= NumberFormat. getNumberInstance(); Number input=fmt. parse(inField.getText().trim()); double x=input. doubleValue();
用Locale对象来做什么? – 它本身并没有太大的作用。需要它的真正原因是: 要把它提供给能够使用locale的方法 – 例如:String类toLowerCase方法和 toUpperCase方法可以接受一个类型为Locale的参 数,因为对于不同的locale来说,形成大写字母的 规则也不相同 Locale类中有一个getDisplayName方法,可以返回 一个用于描述locale的字符串: – Locale loc=new Locale(“de”,”CH”); – System.out.println(loc. getDisplayName(Locale.GERMAN)); – 输出结果为: – Deutsch (Schweiz)