Поддержка 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) отделение интенсивной терапии КЛДР Юникод
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 ниже Android 7.0 (уровень API 24), могли загрузить версию приложения, содержащую библиотеки ICU4J.

Этот раздел начинается с предоставления некоторой базовой информации о минимальных уровнях Android API, необходимых для поддержки этих библиотек. Затем объясняется, что вам нужно знать о реализации ICU4J для Android. Наконец, здесь рассказывается, как использовать API-интерфейсы ICU4J в платформе Android.

ICU4J на Android

Android предоставляет подмножество API-интерфейсов ICU4J через пакет android.icu , а не через com.ibm.icu . Некоторые API-интерфейсы ICU4J не предоставляются платформой Android по таким причинам, как API-интерфейсы, которые устарели или не объявлены стабильными. Поскольку команда ICU в будущем откажется от API, Android также пометит их как устаревшие, но продолжит включать их.

Вот несколько напоминаний:

  • API-интерфейсы платформы Android ICU4J не включают в себя все 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) отделение интенсивной терапии КЛДР Юникод
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 не учитывает настройку формата времени пользователя в 24-часовом/12-часовом формате, полученную из DateFormat.is24HourFormat() . Чтобы соблюдать этот параметр, либо используйте методы форматирования времени DateFormat или DateUtils , либо используйте шаблоны форматирования времени ICU с соответствующими символами шаблонов часов («h» для 12 часов, «H» для 24 часов) для разных возвращаемых значений is24HourFormat() . Например, этот код генерирует строку с текущим временем, которая соответствует настройке пользователя 12 часов/24 часа:

Котлин

val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
        skeleton,
        Locale.getDefault()).format(Date()
)

Ява

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 .