Android 利用 ICU 库 和 CLDR 项目 来提供 Unicode 和其他国际化支持。本页关于 Unicode 和国际化支持的讨论分为两部分:Android 6.0 (API 级别 23) 及更低版本,以及 Android 7.0 (API 级别 24) 及更高版本。
Android 6.0 (API 级别 23) 及更低版本的 Unicode 和国际化支持
Android 平台使用 ICU 和 CLDR 来实现用于处理拉丁语系和非拉丁语系文字的各种类,公开诸如 Locale
、Character
和许多 java.text
子类的类。需要超出公开类的国际化功能,并且目标平台版本为 Android 6.0 (API 级别 23) 及更低版本的应用必须包含 ICU 库。
版本控制
Android 平台的后续版本对应于 ICU 的更新版本以及相应的 CLDR 和 Unicode 版本。表 1 显示了 Android 6.0 (API 级别 23) 及更低版本的此对应关系。
平台 (API 级别) | ICU | CLDR | Unicode |
---|---|---|---|
Android 1.5–2.0 (API 级别 3–7) | 3.8 | 1.5 | 5.0 |
Android 2.2 (API 级别 8) | 4.2 | 1.7 | 5.1 |
Android 2.3–3.0 (API 级别 9–13) | 4.4 | 1.8 | 5.2 |
Android 4.0 (API 级别 14–15) | 4.6 | 1.9 | 6.0 |
Android 4.1 (API 级别 16–17) | 4.8 | 2.0 | 6.0 |
Android 4.3 (API 级别 18) | 50 | 22.1 | 6.2 |
Android 4.4 (API 级别 19–20) | 51 | 23 | 6.2 |
Android 5.0 (API 级别 21–22) | 53 | 25 | 6.3 |
Android 6.0 (API 级别 23) | 55.1 | 27.0.1 | 7.0 |
面向 Android 7.0(API 级别 24)及更高版本的应用,Android 框架为 Unicode 和国际化提供了更全面的支持。本页面的下一部分将详细介绍该支持。
Android 7.0(API 级别 24)及更高版本中的 Unicode 和国际化支持
对于 Android 7.0(API 级别 24)及更高版本,Android 平台为应用开发者提供了一部分 ICU4J API,供其在 android.icu
包下使用。ICU4J 是一个开源的、广泛使用的 Java 库集,为软件应用程序提供 Unicode 和国际化支持。
ICU4J API 使用设备上存在的本地化数据。因此,您可以通过不将 ICU4J 库编译到您的应用中来减小应用的大小。相反,您可以调用框架中的这些库。如果您这样做,您可能需要提供 多个版本的 APK,以便运行低于 Android 7.0(API 级别 24)版本的 Android 用户可以下载包含 ICU4J 库的应用版本。
本节首先提供一些有关支持这些库所需的最低 Android API 级别的一些基本信息。然后解释您需要了解的有关 Android 特定 ICU4J 实现的信息。最后,它告诉您如何在 Android 框架中使用 ICU4J API。
Android 上的 ICU4J
Android 通过 android.icu
包而不是 com.ibm.icu
提供了一部分 ICU4J API。由于某些 API 已被弃用或未声明为稳定,因此 Android 框架未公开某些 ICU4J API。随着 ICU 团队在未来弃用 API,Android 也将其标记为已弃用,但仍会继续包含它们。
以下是一些提醒
- ICU4J Android 框架 API 不包含所有 ICU4J API。
- Android 框架中的 API 不会取代 Android 对 使用资源进行本地化 的支持。
- 在某些情况下,Android 框架支持的字符比 ICU 库多。例如,
android.text
类对表情符号的支持就是这样。
从 com.ibm.icu 迁移到 android.icu 包
如果您已经在您的应用中使用 ICU4J API,并且 android.icu
API 满足您的要求,那么迁移到框架 API 需要您将 Java 导入从 com.ibm.icu
更改为 android.icu
。然后,您可以从应用中删除您自己的 ICU4J 文件副本。
注意:ICU4J 框架 API 使用 android.icu
命名空间而不是 com.ibm.icu
。这样做是为了避免包含自身 com.ibm.icu
库的应用中的命名空间冲突。
从其他 Android SDK API 迁移到 android.icu API
java
和 android
包中的一些类与 ICU4J 中的类等效。但是,ICU4J 通常为标准和语言提供更广泛的支持。
表 2 显示了这些等效性的几个示例,以帮助您入门
类 | 备选方案 |
---|---|
java.lang.Character |
android.icu.lang.UCharacter |
java.text.BreakIterator |
android.icu.text.BreakIterator |
java.text.DecimalFormat |
android.icu.text.DecimalFormat |
java.util.Calendar |
android.icu.util.Calendar |
android.text.BidiFormatter
|
android.icu.text.Bidi
|
android.text.format.DateFormat
|
android.icu.text.DateFormat
|
android.text.format.DateUtils |
android.icu.text.DateFormat android.icu.text.RelativeDateTimeFormatter |
Android 上的 ICU4C
Android 通过 libicu.so
库而不是 libicuuc.so
或 libicui18n.so
公开了一部分 ICU4C API。这些 API 从 Android 12(API 级别 31)开始可用。NDK 标头从 NDK 版本 r22b 开始可用。没有通过 Android NDK 公开 C++ API。部分 C API 不可使用。
版本控制
Android 平台的后续版本对应于更新版本的 ICU,以及相应的 CLDR 和 Unicode 版本。表 3 显示了从 Android 7.0(API 级别 24)开始的对应关系。使用 VersionInfo.ICU_VERSION
API(从 Android 7.0 开始可用)在运行时获取 ICU 版本信息。
平台 (API 级别) | ICU | CLDR | Unicode |
---|---|---|---|
Android 7.0 - 7.1(API 级别 24 - 25) | 56 | 28 | 8.0 |
Android 8.0 - 8.1(API 级别 26 - 27) | 58.2 | 30.0.3 | 9.0 |
Android 9(API 级别 28) | 60.2 | 32.0.1 | 10.0 |
Android 10(API 级别 29) | 63.2 | 34 | 11.0 |
Android 11(API 级别 30) | 66.1 | 36 | 13.0 |
Android 12(API 级别 31 - 32) | 68.2 | 38.1 | 13.0 |
Android 13(API 级别 33) | 70.1 | 40 | 14.0 |
Android 14(API 级别 34) | 72.1 | 42 | 15.0 |
Android 15(API 级别 35) | 75.1 | 45 | 15.1 |
24 小时/12 小时时间格式设置
Android 上的 ICU 不观察用户从DateFormat.is24HourFormat()
获取的 24 小时/12 小时时间格式设置。要观察此设置,可以使用 DateFormat
或 DateUtils
时间格式化方法,或使用具有适当小时模式符号('h' 用于 12 小时,'H' 用于 24 小时)的 ICU 时间格式化模式,用于不同的 is24HourFormat()
返回值。例如,以下代码生成一个包含当前时间的字符串,该字符串会观察用户的 12 小时/24 小时设置Kotlin
val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm" val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton( skeleton, Locale.getDefault()).format(Date() )
Java
String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm"; String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
Transliterator 的稳定性
从 Android 10(API 级别 29)开始,提供Transliterator
用于将文本从一种格式转换为另一种格式。跨 Android 版本和设备,可用转换 ID 集是不稳定的。设备制造商可能会添加额外的转换 ID。开发人员必须在转换文本之前检查可用的 ID,这些 ID 是从 Transliterator.getAvailableIDs()
获取的。许可
ICU4J 在 ICU 许可下发布。有关详细信息,请参阅 ICU 用户指南。