Obsługa kodowania Unicode i internacjonalizacji

Android korzysta z biblioteki ICUprojektu CLDR, aby zapewniać obsługę Unicode i innych funkcji związanych z międzynarodowością. Informacje na tej stronie dotyczące obsługi Unicode i międzynarodowości są podzielone na 2 sekcje: Android 6.0 (poziom interfejsu API 23) i starsze oraz Android 7.0 (poziom interfejsu API 24) i nowsze.

Obsługa Unicode i międzynarodowości do Androida 6.0 (poziom interfejsu API 23)

Platforma Androida korzysta z bibliotek ICU i CLDR do implementowania różnych klas, które obsługują ortografię zarówno łacińską, jak i niełacińską, udostępniając klasy takie jak Locale, Character i wiele podklas java.text. Aplikacja, która wymaga funkcji związanych z międzynarodowością wykraczających poza udostępnione klasy i jest kierowana na wersje platformy do Androida 6.0 (poziom interfejsu API 23), musi zawierać bibliotekę ICU.

Obsługa wersji

Kolejne wersje platformy Android odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 1 pokazuje tę korespondencję w Androidzie 6.0 (poziom API 23).

Tabela 1. Wersje ICU i CLDR używane do Androida 6.0 (poziom interfejsu API 23).

Platforma (poziom interfejsu API) OIOM CLDR Unicode
Android 1.5–2.0 (poziomy interfejsu API 3–7) 3,8 1,5 5,0
Android 2.2 (poziom 8 interfejsu API) 4,2 1,7 5.1
Android 2.3–3.0 (poziomy interfejsu API 9–13) 4.4 1,8 5.2
Android 4.0 (poziomy API 14–15) 4.6 1,9 6.0
Android 4.1 (poziomy interfejsu API 16–17) 4.8 2,0 6.0
Android 4.3 (poziom 18 interfejsu API) 50 22.1 6.2
Android 4.4 (poziomy API: 19–20) 51 23 6.2
Android 5.0 (poziom interfejsu API 21–22) 53 25 6.3
Android 6.0 (poziom 23 interfejsu API) 55.1 27.0.1 7,0

Platforma Androida zapewnia bardziej kompleksową obsługę Unicode i międzynarodowościowości w przypadku aplikacji kierowanych na Androida 7.0 (poziom interfejsu API 24) i nowszych. W następnej sekcji tej strony znajdziesz szczegółowe informacje o tej usłudze.

Obsługa Unicode i międzynarodowościowości w Androidzie 7.0 (poziom interfejsu API 24) i nowszych wersjach

W przypadku Androida 7.0 (poziom interfejsu API 24) i nowszych platforma Androida udostępnia podzbiór interfejsów API ICU4J deweloperom aplikacji w pakiecie android.icu. ICU4J to powszechnie używany zestaw bibliotek Java, które zapewniają obsługę Unicode i międzynarodową aplikacji oprogramowania.

Interfejsy ICU4J API korzystają z danych lokalizacji obecnych na urządzeniu. Dzięki temu możesz zmniejszyć rozmiar swojej aplikacji, nie kompilując w niej bibliotek ICU4J. Zamiast tego możesz wywoływać je w ramach frameworka. W takim przypadku warto udostępnić kilka wersji pliku APK, aby użytkownicy korzystający z wersji Androida starszych niż 7.0 (poziom interfejsu API 24) mogli pobrać wersję aplikacji zawierającą biblioteki ICU4J.

W tej sekcji znajdziesz podstawowe informacje o minimalnych poziomach interfejsu Android API wymaganych do obsługi tych bibliotek. Następnie wyjaśnia, co musisz wiedzieć o implementacji ICU4J w Androidzie. W tym artykule znajdziesz też informacje o tym, jak używać interfejsów ICU4J API w ramach Androida.

ICU4J na Androidzie

Android udostępnia podzbiór interfejsów ICU4J API za pomocą pakietu android.icu, a nie com.ibm.icu. Niektóre interfejsy API ICU4J nie są udostępniane przez platformę Androida z powodów takich jak wycofanie interfejsów API lub niezadeklarowanie ich stabilności. Gdy zespół ICU w przyszłości wycofa interfejsy API, Android również je oznaczy jako przestarzałe, ale nadal będzie je uwzględniać.

Oto kilka przypomnięć:

  • Interfejsy API platformy ICU4J na Androida nie obejmują wszystkich interfejsów ICU4J.
  • Interfejsy API na platformie Androida nie zastępują obsługi lokalizacji za pomocą zasobów w Androidzie.
  • W niektórych przypadkach platforma Androida obsługuje więcej znaków niż biblioteki ICU. Dotyczy to na przykład obsługi emotikonów w klasie android.text.

Przejdź z pakietu com.ibm.icu na pakiet android.icu

Jeśli w swojej aplikacji używasz już interfejsów API ICU4J, a interfejsy API android.icu spełniają Twoje wymagania, migracja do interfejsów API platformy wymaga zmiany importów Javy z com.ibm.icu na android.icu. Następnie możesz usunąć własną kopię plików ICU4J z aplikacji.

Uwaga: interfejsy API w ramach ICU4J używają przestrzeni nazw android.icu zamiast com.ibm.icu. Ma to na celu uniknięcie konfliktów nazw przestrzeni w aplikacjach, które zawierają własne biblioteki com.ibm.icu.

Migracja do interfejsów API android.icu z innych interfejsów API pakietu Android SDK

Niektóre klasy w pakietach javaandroid mają odpowiedniki w pakiecie ICU4J. Jednak ICU4J często zapewnia szerszą obsługę standardów i języków.

Tabela 2 zawiera kilka przykładów tych odpowiedników:

Tabela 2.Klasy ICU4J na Androidzie i Java

Kategoria Alternatywy
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 na Androidzie

Android udostępnia podzbiór interfejsów ICU4C API za pomocą biblioteki libicu.so, a nie libicuuc.so ani libicui18n.so. Interfejsy API są dostępne od Androida 12 (poziom interfejsu API 31). Nagłówki NDK są dostępne od wersji NDK r22b. Interfejs C++ nie jest udostępniany przez NDK Androida. Niektóre interfejsy API w języku C są niedostępne.

Obsługa wersji

Kolejne wersje platformy Android odpowiadają nowszych wersji ICU oraz odpowiadających im wersji CLDR i Unicode. Tabela 3 przedstawia tę zgodność od Androida 7.0 (poziom interfejsu API 24). Aby uzyskać informacje o wersji ICU w czasie działania, użyj interfejsu API VersionInfo.ICU_VERSION (dostępnego od Androida 7.0).

Tabela 3. Wersje ICU i CLDR używane w wersjach Androida od 7.0 (poziom interfejsu API 24) do 15 (poziom interfejsu API 35).

Platforma (poziom interfejsu API) OIOM CLDR Unicode
Android 7.0–7.1 (poziomy interfejsu API 24–25) 56 28 z Androidem 8.0
Android 8.0–8.1 (poziomy interfejsu API 26–27) 58,2 30.0.3 9.0
Android 9 (poziom 28 interfejsu API) 60,2 32.0.1 10,0
Android 10 (poziom 29 interfejsu API) 63,2 34 11.0
Android 11 (poziom 30 interfejsu API) 66,1 36 13.0
Android 12 (poziom API 31–32) 68,2 38.1 13.0
Android 13 (poziom 33 interfejsu API) 70,1 40 14,0
Android 14 (poziom 34 interfejsu API) 72,1 42 15,0
Android 15 (poziom 35 interfejsu API) 75,1 45 15.1

Ustawienie formatu czasu 24-godzinnego/12-godzinnego

ICU na Androidzie nie uwzględnia ustawień formatu czasu 24-godzinnego lub 12-godzinnego użytkownika uzyskanych z  DateFormat.is24HourFormat(). Aby zastosować to ustawienie, użyj metod formatowania czasu DateFormat lub DateUtils lub użyj wzorów formatowania czasu ICU z odpowiednimi symbolami godzin ('h' dla 12 godzin, 'H' dla 24 godzin) dla różnych wartości zwracanych przez is24HourFormat(). Ten kod generuje ciąg znaków z aktualną godziną, uwzględniając ustawienie czasu 12-godzinnego lub 24-godzinnego użytkownika:

Kotlin

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());

Stabilność transliteratora

Od Androida 10 (poziom interfejsu API 29) można używać znaku Transliterator do transliteracji tekstu z jednego formatu na inny. Zestaw dostępnych identyfikatorów transliteracji jest niestabilny w różnych wersjach Androida i na różnych urządzeniach. Producenci urządzeń mogą dodawać dodatkowe identyfikatory transliteracji. Przed transliteracją tekstu deweloperzy muszą sprawdzić dostępne identyfikatory, które można uzyskać z  Transliterator.getAvailableIDs().

Licencjonowanie

ICU4J jest udostępniany na licencji ICU. Szczegółowe informacje znajdziesz w przewodniku użytkownika po ICC.