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 框架为面向 Android 7.0(API 级别 24)及更高版本的应用提供了更全面的 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 级别的一些基本信息。然后,它解释了您需要了解的有关 ICU4J 的 Android 特定实现的内容。最后,它告诉您如何在 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
库公开 ICU4C API 的一个子集,而不是 libicuuc.so
或 libicui18n.so
。这些 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
用于将文本从一种格式转换到另一种格式。可用的转换 ID 集在 Android 版本和设备之间不稳定。设备制造商可能会添加额外的转换 ID。开发人员必须在转换文本之前检查可用的 ID,这些 ID 可以从 Transliterator.getAvailableIDs()
获取。许可
ICU4J 在 ICU 许可证下发布。有关详细信息,请参阅 ICU 用户指南。