ICU 及 ICU4JICU (International Components for Unicode) 是一套成熟的、功能强大、易用和跨平台支持 Unicode 标准的 C/C++和 Java 库,为软件应用程序提供 Unicode 和全球化支持。 并且是开放源代码的,IBM 与开源组织合作研究,由 IBM 发布和维护。软件开发者很容易利用 ICU 解决任何软件全球化的问题,根据各地的风俗语言习惯,实现对数字、货币、时间、日期等格式化和解析;对字符串进行转换、搜索和排序等功能,此外,ICU 也提供了对双向字符串(BIDI)算法,对如阿拉伯语和希伯来语有很好的支持。ICU 分为 ICU4C 和 ICU4J,分别对应 Java 和 C/C++平台。
对于 Java 应用程序,ICU4J 逐渐取代了 JDK 提供的相关功能,因为 ICU4J 提供了更多的功能,如基于 CLDR 数据库的 Locale 信息、最新 Unicode 标准的参考实现、实时的版本更新以及较高的性能。最新的 ICU4J 版本是 60.2,对最新的 Unicode 标准 Unicode 10.0,CLDR 32 有很好的支持,并且在 Java 9 上进行了测试,用于数字格式化的新 API 更加注重于可用性,健壮性,表 4 列出了 ICU4J 提供的常用功能及其 API。
表 4. ICU4J 功能列表功能列表功能介绍API
Unicode 文本
处理 支持 Unicode 标准规定中的所有 Unicode 字符属性
UCharacter, UCharacter,UnicodeBlock 排序&查找 根据特定语言,地区或国家的惯例和标准比较字符串。ICU 的排序规则是基于 Unicode 排序算法以及来自 Common Locale Data Repository 的语言环境特定比较规则 CollationElementIterator, Collator
RuleBasedCollator 基于 CLDR 库的 Locale Unicode 通用语言环境数据存储库。由 Unicode 联合会(http://www.unicode.org/cldr/)维护的 XML 格式的语言环境数据库。该存储库提供软件产品本地化所需的信息,包括日期,时间,数量和货币格式; 排序,搜索和匹配信息; 并翻译了语言,地区,脚本,货币和时区的名称。像苹果、谷歌、IBM、微软、Oracle 等等很多公司都在使用 ULocale Resource Bundles 资源文件管理 UResourceBundle 日历&时区 在传统的公历日历之外提供了多种类型的日历。提供了一套完整的时区计算 API,比如中国的农历等; Calendar, GregorianCalendar, SimpleTimeZone, TimeZone Bidi 支持处理包含从左到右(英文)和从右到左(阿拉伯文或希伯来文)数据混合的文本 Bidi Unicode 正则
表达式 ICU 的正则表达式完全支持 Unicode,同时提供非常有竞争力的性能 UnicodeMatcher 文本边界 在文本范围内查找单词,句子,段落的位置,或在显示文本时标识适合换行的位置 BreakIterator, StringCharacterIterator, StringTokenizer 格式化:时间&日期 根据所选语言环境的风俗习惯格式化数字,日期,时间和货币金额,以及时间日期的缩写等 DateFormat, DateFormat.Field, DateFormatSymbols, SimpleDateFormat 格式化:数字&货币
Currency, DecimalFomat, DecimalFormatSymbols, NumberFormat, NumberFormat.Field 文本转换:规范化 Normalization 将 Unicode 文本转成等价的规范化格式内容,从而更好的进行比较排序等 Normalizer 大小写转换 大小写转换 CaseInsensitiveString 代码页转换和 Transliterations 将文本数据转换为 Unicode 或其他字符集或编码。ICU 的转换表基于 IBM 在过去几十年中收集的字符集数据,相对是最全面的。 Transliterator
CharsetICU
CharsetEncoderICU
CharsetDecoderICU
下面将基于项目实践,列出几个 ICU4J API 应用实例。在支持多语言的应用程序中,根据用户 Locale 对日期时间的显示和解析是最基本的功能。清单 1 是 Java 和 ICU4J 中时间日期格式化显示对比。
清单 1. Java 和 ICU4J 中的时间日期格式化 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| private static void DateTimeFormat() throws ParseException {
Date date = new Date(1234567890L);
Locale locale = Locale.CHINA;
//ICU4J DateFormat
DateFormat dateFormatShort =
com.ibm.icu.text.DateFormat.getDateTimeInstance(
DateFormat.SHORT, DateFormat.SHORT, locale);
DateFormat dateFormatMedium =
com.ibm.icu.text.DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
DateFormat dateFormatLong =
com.ibm.icu.text.DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG, locale);
DateFormat dateFormatFull =
com.ibm.icu.text.DateFormat.getDateTimeInstance(
DateFormat.FULL, DateFormat.FULL, locale);
//Java DateFormat
java.text.DateFormat javaDateFormatShort =
java.text.DateFormat.getDateTimeInstance(
DateFormat.SHORT, DateFormat.SHORT, locale);
DateFormat javaDateFormatMedium =
java.text.DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
java.text.DateFormat javaDdateFormatLong =
java.text.DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG, locale);
java.text.DateFormat javaDateFormatFull =
java.text.DateFormat.getDateTimeInstance(
DateFormat.FULL, DateFormat.FULL, locale);
String icu_Short = dateFormatShort.format(date);
String icu_Medium = dateFormatMedium.format(date);
String icu_long = dateFormatLong.format(date);
String icu_full = dateFormatFull.format(date);
String java_Short = javaDateFormatShort.format(date);
String java_Medium = javaDateFormatMedium.format(date);
String java_long = javaDdateFormatLong.format(date);
String java_full = javaDateFormatFull.format(date);
System.out.println("Java 和 ICU4J 中的时间日期格式化: \nAPI\t Short 格式\t\t Medium
格式\t\t\tLong 格式\t\t\t\tFull 格式");
System.out.println("=====\t=========\t\t============\t\t\t================\t\t====================");
System.out.println("ICU4J\t" + icu_Short + "\t" + icu_Medium +"\t\t" +
icu_long +"\t" + icu_full);
System.out.println("Java \t" + java_Short + "\t\t" + java_Medium +"\t\t" +
java_long +"\t" + java_full);
}
|
图 9. Java 和 ICU4J 中的时间日期格式化 |