Android利用 ICU库和 CLDR项目来提供Unicode和其他国际化支持。本文档关于Unicode和国际化支持的讨论分为两部分:Android 6.0(API级别23)及更低级别,Android 7.0(API级别24)及更高级别。
通过Android 6.0支持Unicode和国际化(API级别23)
而Android平台使用ICU和CLDR实现各种类处理拉丁文和非拉丁文拼写法,揭露类,如Locale
,Character
和许多子类java.text
。应用程序的国际化功能超越了暴露的类,并且通过Android 6.0(API级别23)针对平台版本,必须在其APK中包含ICU库。
版本
Android平台的连续发行版对应于较新版本的ICU(以及相应的CLDR和Unicode版本)。表1通过Android 6.0(API等级23)显示了这种对应关系。
平台(API级别) | ICU | CLDR | 统一 |
---|---|---|---|
Android 1.5-2.0(API等级3-7) | 3.8 | 1.5 | 5 |
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 |
Android 4.1(API等级16-17) | 4.8 | 2.0 | 6 |
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 |
面向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中来缩小APK占用空间; 相反,你可以简单地在框架中向他们发出呼吁。(在这种情况下,您可能需要提供 APK的多个版本,因此运行低于Android 7.0(API级别24)的Android版本的用户可以下载包含ICU4J库的应用程序版本。)
本文档首先提供一些关于支持这些库所需的最低Android API级别的基本信息。然后,它解释了您需要了解的ICU4J的Android特定实现。最后,它会告诉您如何在Android框架中使用ICU4J API。
Android上的ICU4J
Android通过android.icu
软件包公开了ICU4J API的一个子集 ,而不是com.ibm.icu
。Android框架可能会因为各种原因选择不公开ICU4J API:例如,由于API已被弃用或未声明为稳定。由于ICU团队将来会弃用API,Android也会将其标记为已弃用,但将继续包含这些API。
以下是一些需要注意的重要事项:
- ICU4J Android框架API不包含所有的ICU4J API。
- NDK不支持Android ICU4C。
- Android框架中的API不能取代Android对资源本地化的支持 。
- 在某些情况下,Android框架比ICU库支持更多的字符。例如,这个
android.text
类对于表情符号的支持是正确的。
从com.ibm.icu迁移到android.icu包
如果您已经在您的应用中使用ICU4J API,并且 android.icu
API满足您的要求,那么迁移到框架API需要您将Java导入从更改com.ibm.icu
为android.icu
。然后,您可以从APK中删除自己的ICU4J文件副本。
注意:ICU4J框架API使用android.icu
名称空间而不是com.ibm.icu
。这是为了避免包含自己的com.ibm.icu
库的APK中的名称空间冲突。
从其他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平台的连续发行版对应于较新版本的ICU(以及相应的CLDR和Unicode版本)。表3显示了从Android 7.0开始的这种对应关系(API级别24)。
平台(API级别) | ICU | CLDR | 统一 |
---|---|---|---|
Android 7.0 - 7.1(API等级24 - 25) | 56 | 28 | 8 |
Android 8.0 - 8.1(API等级26 - 27) | 58.2 | 30.0.3 | 9 |
Android P(API级别P) | 60.2 | 32.0.1 | 10.0 |
24h / 12h时间格式设置
安卓ICU不会观察用户24h / 12h时间格式设置(从中获得 )为了观察设置,请使用 或 时间格式化方法或使用带有适当小时模式符号的ICU时间格式模式('h'为12小时, 'H'24小时)以获得不同的返回值。例如,此代码将生成一个具有当前时间的字符串,以观察用户12小时/ 24小时设置:DateFormat.is24HourFormat()
DateFormat
DateUtils
is24HourFormat()
字符串
骨架
=
DateFormat 。is24HourFormat (上下文)?“Hm” :“hm” ; String formattedTime = android 。icu 。文本。DateFormat 。getInstanceForSkeleton (骨架,区域设置。getDefault ())。格式(新日期());
许可
ICU4J根据ICU许可证发布。有关详细信息,请参阅ICU用户指南。