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ą. Opis obsługi standardu Unicode i internacjonalizacji jest podzielony na 2 sekcje: Android 6.0 (poziom interfejsu API 23) i starszy oraz Android 7.0 (poziom API 24) i nowszy.

Obsługa standardu Unicode i internacjonalizacji do Androida 6.0 (poziom API 23)

Platforma Androida korzysta z ICU i CLDR do wdrożenia różnych klas do obsługi ortografii łacińskich i innych niż łacińskie oraz ujawniania klas takich jak Locale, Character i wielu podklas klasy java.text. Aplikacja, która wymaga funkcji internacjonalizacji wykraczających poza klasy ujawnione 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 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 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 (poziomy 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 znajdziesz szczegółowe informacje na temat tej pomocy.

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

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 API ICU4J wykorzystują dane lokalizacji znajdujące się 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 na Androida. 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 API ICU4J za pomocą pakietu android.icu, a nie com.ibm.icu. Niektóre interfejsy ICU4J nie są udostępniane przez platformę Androida, ponieważ są wycofane lub nie są deklarowane jako stabilne. W miarę jak zespół OIOM-ów będzie w przyszłości wycofywać interfejsy API, Android również oznaczy je jako wycofane, ale wciąż będzie je uwzględniać.

Oto kilka przypomnięć:

  • Interfejsy API platformy ICU4J Androida nie obejmują wszystkich interfejsów ICU4J API.
  • 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 emoji przez klasę android.text.

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

Jeśli w swojej aplikacji używasz już interfejsów ICU4J i interfejsy android.icu spełniają Twoje wymagania, przeniesienie na interfejsy frameworku wymaga zmiany importów Java z com.ibm.icu na android.icu. Następnie możesz usunąć swoją 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 i Java na Androida

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 API ICU4C za pomocą biblioteki libicu.so, a nie libicuuc.so lub libicui18n.so. Interfejsy API są dostępne od Androida 12 (poziom API 31). Nagłówki NDK są dostępne od wersji NDK r22b. Interfejs C++ nie jest udostępniany przez NDK Androida. Niektóre interfejsy 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 API: 24–25) 56 28 z Androidem 8.0
Android 8.0–8.1 (poziomy 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–32 interfejsu API) 68,2 38,1 13.0
Android 13 (poziom 33 interfejsu API) 70,1 40 14,0
Android 14 (poziom API 34) 72,1 42 15,0
Android 15 (poziom API 35) 75,1 45 15.1

Ustawienie formatu godziny 24h/12h

ICU na Androidzie nie uwzględnia ustawień formatu czasu 24-godzinnego lub 12-godzinnego użytkownika uzyskanych z  DateFormat.is24HourFormat(). Aby zaobserwować to ustawienie, użyj metod formatowania czasu DateFormat lub DateUtils albo zastosuj wzorce formatowania czasu ICU z odpowiednimi symbolami wzorca godzin (h” oznacza 12 godzin, „H” dla 24 godzin) dla różnych wartości zwracanych is24HourFormat(). Ten kod generuje na przykład ciąg znaków z bieżącą godziną, który rejestruje ustawienie 12 godzin/24 godzin dla 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) usługa Transliterator jest dostępna do transliteracji tekstu z jednego formatu na drugi. 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.