Obsługa kodowania Unicode i internacjonalizacji

Android korzysta z biblioteki IU i projektu CLDR, aby zapewnić obsługę standardu Unicode oraz innych procesów internacjonalizacji. Omówienie obsługi Unicode i internacjonalizacji jest podzielone na 2 sekcje: Android 6.0 (poziom interfejsu API 23) i starszy oraz Android 7.0 (poziom API 24) i nowsze.

Obsługa Unicode i internacjonalizacji w Androidzie 6.0 (poziom API 23)

Platforma Android używa ICU i CLDR do wdrażania różnych klas do obsługi ortograficznych alfabetów łacińskich i innych niż łacińskie, a także klas ekspozycji, takich jak Locale, Character i wielu podklas, w tym java.text. Aplikacja, która wymaga funkcji internacjonalizacji wykraczających poza dostępne klasy i jest kierowana na wersje platformy na Androida 6.0 (poziom interfejsu API 23), musi zawierać bibliotekę ICU.

Obsługa wersji

Kolejne wersje platformy Androida odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 1 przedstawia tę zależność 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 API 8) 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 interfejsu 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 API 18) 50 22,1 6.2
Android 4.4 (poziomy interfejsu API 19–20) 51 23 6.2
Android 5.0 (poziomy interfejsu API 21–22) 53 25 6.3
Android 6.0 (poziom API 23) 55,1 27.0.1 7,0

Platforma Android zapewnia bardziej kompleksową obsługę Unicode oraz internacjonalizacji w przypadku aplikacji kierowanych na Androida 7.0 (poziom API 24) i nowsze. W następnej sekcji tej strony znajdziesz szczegółowe informacje o tej obsłudze.

Obsługa Unicode i internacjonalizacji na Androidzie 7.0 (poziom API 24) i nowszych

W przypadku Androida 7.0 (poziom interfejsu API 24) lub nowszego platforma Androida udostępnia podzbiór interfejsów API ICU4J deweloperom aplikacji w ramach pakietu android.icu. ICU4J to powszechnie używany zestaw bibliotek Java typu open source, umożliwiający obsługę kodowania Unicode i internacjonalizacji dla aplikacji.

Interfejsy ICU4J API używają danych lokalizacyjnych znajdujących się na urządzeniu. W rezultacie możesz zmniejszyć użycie pamięci aplikacji, nie instalując w niej bibliotek ICU4J. Zamiast tego możesz zwracać się do nich w ramach platformy. Jeśli to zrobisz, możesz udostępnić kilka wersji pliku APK, aby użytkownicy korzystający z Androida w wersji starszej niż 7.0 (poziom interfejsu API 24) mogli pobrać wersję aplikacji zawierającą biblioteki ICU4J.

Na początku tej sekcji przedstawiamy podstawowe informacje o minimalnych poziomach interfejsu Android API wymaganych do obsługi tych bibliotek. Wyjaśniono w nim, co należy wiedzieć o implementacji ICU4J w Androidzie. Szkolenie zawiera też instrukcje korzystania z interfejsów API ICU4J w platformie Androida.

ICU4J na Androidzie

Android ujawnia podzbiór interfejsów API ICU4J za pomocą pakietu android.icu, a nie com.ibm.icu. Niektóre interfejsy API ICU4J nie są udostępniane przez platformę Androida z powodu ich wycofania lub niezadeklarowania jako stabilnej. Ponieważ zespół ICU wycofuje interfejsy API w przyszłości, Android również oznaczy je jako wycofane, ale nadal będzie je uwzględniać.

Oto kilka przypomnień:

  • Interfejsy API platformy Android ICU4J nie zawierają wszystkich interfejsów ICU4J.
  • Interfejsy API w ramach platformy Android nie zastępują obsługi lokalizowania za pomocą zasobów obsługiwanego przez Androida.
  • 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ź ze strony com.ibm.icu na pakiet android.icu

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

Uwaga: interfejsy API platformy ICU4J używają przestrzeni nazw android.icu zamiast com.ibm.icu. Ma to na celu uniknięcie konfliktów przestrzeni nazw 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 java i android mają swoje odpowiedniki w ICU4J. ICU4J często jednak zapewnia szerszą obsługę standardów i języków.

Na początek tabela 2 zawiera kilka przykładów porównań:

Tabela 2.Klasy ICU4J dla Androida 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 ujawnia podzbiór interfejsów API ICU4C za pomocą biblioteki libicu.so, a nie libicuuc.so czy libicui18n.so. Interfejsy API są dostępne od Androida 12 (poziom API 31). Nagłówki NDK są dostępne od wersji r22b NDK. Żaden interfejs API C++ nie jest dostępny w pakiecie NDK Androida. Niektóre interfejsy API typu C są niedostępne.

Obsługa wersji

Kolejne wersje platformy Androida odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 3 przedstawia tę korespondencję od Androida 7.0 (poziom API 24).

Tabela 3. Wersje ICU i CLDR używane na Androidzie 7.0 (poziom interfejsu API 24) i nowszych.

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 31 interfejsu API) 68,2 38,1 13,0

Ustawienie formatu godziny: 24 godz./12 godz.

Okienko ICU na urządzeniu z Androidem nie obserwuje ustawienia formatu godziny 24 godzin i 12 godzin użytkownika (uzyskane z DateFormat.is24HourFormat()). Aby obserwować to ustawienie, użyj metod formatowania czasu DateFormat lub DateUtils lub wzorców formatowania czasu ICU z odpowiednimi symbolami godzin („h” – 12 godz., „H” – 24 godz.) dla różnych wartości zwracanych parametru is24HourFormat(). Na przykład ten kod generuje ciąg znaków z bieżącą godziną zgodną z ustawieniem 12/24 godz.

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) dostępny jest interfejs Transliterator do transliteracji tekstu z jednego formatu na inny. Zbiór dostępnych identyfikatorów translacji jest niestabilny w przypadku różnych wersji i urządzeń z Androidem. Producenci urządzeń mogą dodać dodatkowe identyfikatory transliteracji. Przed transliteracją tekstu deweloperzy muszą sprawdzić dostępne identyfikatory uzyskane z kodu Transliterator.getAvailableIDs().

Licencjonowanie

Zwolnienie z ICU4J w ramach licencji na OIOM-ie. Szczegółowe informacje znajdziesz w przewodniku użytkownika ICC (w języku angielskim).