Android использует библиотеку ICU и проект CLDR для обеспечения поддержки Unicode и других интернационализационных функций. Обсуждение поддержки Unicode и интернационализации на этой странице разделено на две части: Android 6.0 (уровень API 23) и ниже, а также Android 7.0 (уровень API 24) и выше.
Поддержка Unicode и интернационализации через Android 6.0 (уровень API 23)
Платформа Android использует ICU и CLDR для реализации различных классов, обрабатывающих как латинскую, так и нелатинскую орфографию, предоставляя такие классы, как Locale , Character и множество подклассов java.text . Приложение, которому требуются функции интернационализации, выходящие за рамки предоставляемых классов, и ориентированное на версии платформы до Android 6.0 (уровень API 23), должно включать библиотеку ICU.
Версионирование
Последовательные версии платформы Android соответствуют более новым версиям ICU, а также соответствующим версиям CLDR и Unicode. В таблице 1 показано это соответствие до Android 6.0 (уровень API 23).
Таблица 1. Версии ICU и CLDR, используемые в Android 6.0 (уровень API 23).
| Платформа (уровень API) | реанимация | CLDR | Юникод |
|---|---|---|---|
| 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 обеспечивает более полную поддержку Unicode и интернационализацию для приложений, ориентированных на Android 7.0 (уровень API 24) и выше. В следующем разделе этой страницы представлена подробная информация об этой поддержке.
Поддержка Unicode и интернационализации в Android 7.0 (уровень API 24) и выше.
Для Android 7.0 (уровень API 24) и выше платформа Android предоставляет разработчикам приложений подмножество API ICU4J, которые можно использовать в пакете android.icu . ICU4J — это набор библиотек Java с открытым исходным кодом, широко используемый и обеспечивающий поддержку Unicode и интернационализации для программных приложений.
API ICU4J используют данные локализации, имеющиеся на устройстве. В результате вы можете уменьшить размер вашего приложения, не компилируя библиотеки ICU4J в него. Вместо этого вы можете обращаться к ним через фреймворк. В этом случае вам может потребоваться предоставить несколько версий вашего APK , чтобы пользователи, работающие с версиями Android ниже 7.0 (уровень API 24), могли загрузить версию приложения, содержащую библиотеки ICU4J.
В этом разделе сначала приводится основная информация о минимальных уровнях API Android, необходимых для поддержки этих библиотек. Затем объясняется, что нужно знать о реализации ICU4J, специфичной для Android. Наконец, рассказывается, как использовать API ICU4J в среде Android.
ICU4J на Android
Android предоставляет доступ к части API ICU4J через пакет android.icu , а не через com.ibm.icu . Некоторые API ICU4J не доступны через фреймворк Android по таким причинам, как устаревание или отсутствие стабильной конфигурации. По мере того, как команда ICU будет объявлять API устаревшими в будущем, Android также будет помечать их как устаревшие, но продолжит включать их в свою библиотеку.
Вот несколько напоминаний:
- API-интерфейсы фреймворка ICU4J для Android не включают все API-интерфейсы ICU4J.
- API-интерфейсы в фреймворке Android не заменяют поддержку локализации с помощью ресурсов в Android.
- В некоторых случаях фреймворк Android поддерживает больше символов, чем библиотеки ICU. Это, например, относится к поддержке эмодзи в классе
android.text.
Перейдите на использование пакета android.icu из com.ibm.icu.
Если вы уже используете API ICU4J в своем приложении, и API android.icu соответствуют вашим требованиям, то для перехода на API фреймворка вам потребуется изменить импорт Java с com.ibm.icu на android.icu . После этого вы можете удалить свою собственную копию файлов ICU4J из приложения.
Примечание : API фреймворка ICU4J используют пространство имен android.icu вместо com.ibm.icu . Это сделано для предотвращения конфликтов имен в приложениях, содержащих собственные библиотеки com.ibm.icu .
Переход на API android.icu с других API Android SDK
Некоторые классы в пакетах java и android имеют аналоги в ICU4J. Однако ICU4J часто обеспечивает более широкую поддержку стандартов и языков.
В таблице 2 приведены некоторые примеры таких эквивалентностей, которые помогут вам начать:
Таблица 2. Классы ICU4J для Android и Java.
| Сорт | Альтернативы |
|---|---|
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 |
ICU4C на Android
Android предоставляет доступ к части API ICU4C через библиотеку libicu.so , а не через libicuuc.so или libicui18n.so . API доступны начиная с Android 12 (уровень API 31). Заголовочные файлы NDK доступны начиная с релиза NDK r22b. API C++ через Android NDK не предоставляются. Некоторые API C недоступны.
Версионирование
Последовательные выпуски платформы Android соответствуют более новым версиям ICU, а также соответствующим версиям CLDR и Unicode. В таблице 3 показано это соответствие, начиная с Android 7.0 (уровень API 24). Используйте API VersionInfo.ICU_VERSION (доступен с Android 7.0) для получения информации о версии ICU во время выполнения.
Таблица 3. Версии ICU и CLDR, используемые в версиях Android от Android 7.0 (уровень API 24) до Android 15 (уровень API 35).
| Платформа (уровень API) | реанимация | CLDR | Юникод |
|---|---|---|---|
| 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ч
ICU на Android не учитывает установленный пользователем формат времени 24h/12h, получаемый изDateFormat.is24HourFormat() . Чтобы учесть этот параметр, используйте методы форматирования времени DateFormat или DateUtils , либо шаблоны форматирования времени ICU с соответствующими символами часового шаблона («h» для 12h, «H» для 24h) для разных значений, возвращаемых is24HourFormat() . Например, этот код генерирует строку с текущим временем, учитывающую установленный пользователем формат 12h/24h: Котлин
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());
Стабильность транслитератора
Начиная с Android 10 (уровень API 29), предоставляетсяTransliterator для транслитерации текста из одного формата в другой. Набор доступных идентификаторов транслитерации нестабилен в разных версиях Android и на разных устройствах. Производители устройств могут добавлять дополнительные идентификаторы транслитерации. Разработчики должны проверять доступные идентификаторы, полученные с помощью Transliterator.getAvailableIDs() , перед транслитерацией текста.Лицензирование
ICU4J распространяется под лицензией ICU. Подробности см. в руководстве пользователя ICU .