Obsługa kodowania Unicode i internacjonalizacji

Android korzysta z biblioteki ICU projektu lokalizowania na potrzeby międzynarodowe 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 do obsługi ortografii łacińskiej i niełacińskiej, 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 przedstawia tę zgodność do Androida 6.0 (poziom interfejsu 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 pomocy.

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) lub nowszego platforma Androida udostępnia podzbiór interfejsów ICU4J dla deweloperów aplikacji do wykorzystania w pakiecie android.icu. ICU4J to powszechnie używany zbiór 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 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 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. 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 w platformie Android 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ź z pakietu com.ibm.icu na pakiet android.icu

Jeśli w swojej aplikacji używasz już interfejsów ICU4J i interfejsy android.icu spełniają Twoje wymagania, migracja do interfejsów frameworku wymaga zmiany importów Java 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 przykłady takich ekwiwalencji:

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 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 C są niedostępne.

Obsługa wersji

Kolejne wersje platformy Android odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 3 przedstawia tę zgodność od Androida 7.0 (poziom interfejsu API 24). Aby uzyskać informacje o wersji ICU w czasie wykonywania, 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 31–32 interfejsu API) 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

Począwszy od Androida 10 (poziom interfejsu API 29) udostępniamy znak Transliterator, który umożliwia transliterację tekstu z jednego formatu na inny. Zestaw dostępnych identyfikatorów transliteracji jest niestabilny w przypadku różnych wersji i urządzeń z Androidem. 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 ICU.