文档

Java™ 教程
隐藏目录
创建区域设置
教程: 国际化
课程: 设置区域设置

创建区域设置

创建Locale对象有几种方法。无论使用哪种技术,创建都可以简单地指定语言代码。但是,您还可以通过设置区域(也称为“国家”)和变体代码来进一步区分区域设置。如果您使用的是JDK 7或更高版本,还可以指定脚本代码和Unicode区域设置扩展。

创建Locale对象的四种方法如下:


版本说明: Locale.Builder类和forLanguageTag方法是在Java SE 7发布中添加的。

LocaleBuilder

可以使用Locale.Builder实用类构建符合IETF BCP 47语法的Locale对象。例如,要指定法语语言和加拿大国家,可以调用Locale.Builder构造函数,然后使用setter方法链接如下:

Locale aLocale = new Locale.Builder().setLanguage("fr").setRegion("CA").build();

下一个示例创建了美国和英国的英语语言的Locale对象:

Locale bLocale = new Locale.Builder().setLanguage("en").setRegion("US").build();
Locale cLocale = new Locale.Builder().setLanguage("en").setRegion("GB").build();

最后一个示例创建了俄语语言的Locale对象:

Locale dLocale = new Locale.Builder().setLanguage("ru").setScript("Cyrl").build();

Locale构造函数

Locale类提供了三个构造函数来创建Locale对象:

以下示例创建了法语(加拿大)、英语(美国和英国)和俄语的Locale对象。

aLocale = new Locale("fr", "CA");
bLocale = new Locale("en", "US");
cLocale = new Locale("en", "GB");
dLocale = new Locale("ru");

在JDK 7之前的发布版本中,无法在Locale对象上设置脚本代码。

forLanguageTag工厂方法

如果您有符合IETF BCP 47标准的语言标签字符串,您可以使用Java SE 7版本引入的forLanguageTag(String)工厂方法。例如:

Locale aLocale = Locale.forLanguageTag("en-US");
Locale bLocale = Locale.forLanguageTag("ja-JP-u-ca-japanese");

Locale常量

为方便起见,Locale类提供了一些语言和国家的常量。例如:

cLocale = Locale.JAPAN;
dLocale = Locale.CANADA_FRENCH;

当您指定语言常量时,Locale的区域部分未定义。下面的三个语句创建了等效的Locale对象:

j1Locale = Locale.JAPANESE;
j2Locale = new Locale.Builder().setLanguage("ja").build();
j3Locale = new Locale("ja");

以下三个语句创建的Locale对象也是等效的:

j4Locale = Locale.JAPAN;
j5Locale = new Locale.Builder().setLanguage("ja").setRegion("JP").build();
j6Locale = new Locale("ja", "JP");

代码

以下部分讨论语言代码和可选的脚本、地区和变体代码。

语言代码

语言代码是符合ISO 639标准的两个或三个小写字母。您可以在http://www.loc.gov/standards/iso639-2/php/code_list.php找到ISO 639代码的完整列表。

以下表格列出了一些语言代码。

示例语言代码
语言代码 描述
de 德语
en 英语
fr 法语
ru 俄语
ja 日语
jv 爪哇语
ko 韩语
zh 中文

脚本代码

脚本代码以一个大写字母开头,后跟三个小写字母,并符合ISO 15924标准。你可以在http://unicode.org/iso15924/iso15924-codes.html找到ISO 15924代码的完整列表。

下表列出了一些脚本代码。

示例脚本代码
脚本代码 描述
Arab 阿拉伯语
Cyrl 西里尔字母
Kana 片假名
Latn 拉丁字母

有三种方法可以检索Locale的脚本信息:

地区代码

地区(国家)代码由两个或三个大写字母组成,符合ISO 3166标准,或者由三个符合UN M.49标准的数字组成。这些代码可以在http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html找到。

下表包含了一些示例国家和地区代码。

示例地区代码
A-2 代码 A-3 代码 数字代码 描述
AU AUS 036 澳大利亚
BR BRA 076 巴西
CA CAN 124 加拿大
CN CHN 156 中国
DE DEU 276 德国
FR FRA 250 法国
IN IND 356 印度
RU RUS 643 俄罗斯联邦
US USA 840 美国

变体代码

可选的variant代码可用于进一步区分您的Locale。例如,变体代码可以用于指示不受地区代码覆盖的方言差异。


版本说明: 在Java SE 7版本发布之前,变体代码有时用于标识与语言或地区无关的差异。例如,它可以用于标识计算平台之间的差异,如Windows或UNIX。根据IETF BCP 47标准,不鼓励使用此用法。

要定义与您的环境相关的非语言特定变化,请使用扩展机制,如BCP 47 扩展中所述。

从Java SE 7版本开始,遵循IETF BCP 47标准,变体代码专门用于指示定义语言或其方言的其他变化。IETF BCP 47标准对变体子标记施加了句法限制。您可以在http://www.iana.org/assignments/language-subtag-registry上查看变体代码列表(搜索variant)。

例如,Java SE使用变体代码来支持泰语。按照惯例,对于thth_TH区域设置的NumberFormat对象将使用常见的阿拉伯数字形状,或者阿拉伯数字,来格式化泰语数字。然而,对于th_TH_TH区域设置的NumberFormat将使用泰语数字形状。下面是从ThaiDigits.java中的代码片段:

String outputString = new String();
Locale[] thaiLocale = {
             new Locale("th"),
             new Locale("th", "TH"),
             new Locale("th", "TH", "TH")
         };

for (Locale locale : thaiLocale) {
    NumberFormat nf = NumberFormat.getNumberInstance(locale);
    outputString = outputString + locale.toString() + ": ";
    outputString = outputString + nf.format(573.34) + "\n";
}

以下是此示例的屏幕截图:

示例ThaiDigits.java的屏幕截图

上一页: 设置区域设置
下一页: BCP 47 扩展