Поддержка Unicode и интернационализации

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 .