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)的这种对应关系。
表1.通过Android 6.0使用的ICU和CLDR版本(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也会将其标记为已弃用,但会继续包含它们。
以下是一些需要注意的重要事项:
- 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显示了这些等效的一些示例,可帮助您入门:
表2. Android和Java ICU4J类
类 备择方案
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)开始的这种对应关系。
表3. Android 7.0(API级别24)及更高版本中使用的ICU和CLDR版本。
平台(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 9(API级别28) | 60.2 | 32.0.1 | 10.0 |
24小时/ 12小时时间格式设置
Android上的ICU没有观察用户的24小时/ 12小时时间格式设置(从中获取 )。为了观察设置,使用 或 时间格式化方法或使用ICU时间格式化模式和适当的小时模式符号('h'表示12h,'H'表示24h)以获得不同的返回值。例如,此代码将生成一个当前时间的字符串,该字符串将观察用户的12h / 24h设置:DateFormat.is24HourFormat()
DateFormat
DateUtils
is24HourFormat()
String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
许可
CU4J根据ICU许可证发布。有关详细信息,请参阅“ ICU用户指南”。