Java 10 本地化增强:扩展 Unicode 语言标签与更新相关 API
JEP 314:Unicode 语言标签扩展
Java 7 引入 BCP 47 语言标签支持,但 Unicode 区域扩展仅限日历与数字。Java 10 依据 LDML 规范扩展 java.util.Locale 及相关类,新增 4 类扩展键:
| 键 | 含义 | 示例值 |
|---|---|---|
cu | 货币类型 | USD、EUR、CNY |
fw | 一周的第一天 | mon、sun、sat |
rg | 区域覆盖 | USZZZZ、CNZZZZ |
tz | 时区 | America/New_York、Asia/Shanghai |
语言标签示例:zh-CN-u-cu-CNY-fw-mon-tz-Asia/Shanghai
更新的核心 API
以下类/方法现支持解析与格式化新增扩展:
java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.time.format.DecimalStyle::of
java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek, getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider
使用示例
import java.util.Locale;
import java.util.Currency;
import java.time.format.DateTimeFormatter;
import java.time.ZonedDateTime;
public class Demo {
public static void main(String[] args) {
// 带货币扩展的 Locale
Locale locale = Locale.forLanguageTag("zh-CN-u-cu-CNY");
Currency currency = Currency.getInstance(locale);
System.out.println("Currency: " + currency.getCurrencyCode()); // CNY
// 带时区扩展的 DateTimeFormatter
Locale localeTz = Locale.forLanguageTag("en-US-u-tz-America/New_York");
DateTimeFormatter fmt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.localizedBy(localeTz);
System.out.println("Formatted: " + ZonedDateTime.now().format(fmt));
}
}
意义
- 统一通过语言标签表达货币、周起始日、时区等偏好,无需分离 API。
- 提升国际化应用的配置灵活性与跨平台一致性。
- 符合 Unicode CLDR/LDML 最新规范,便于与 ICU、JavaScript Intl 等生态互操作。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- Java 10 本地化增强:扩展 Unicode 语言标签与更新相关 API