Obsługa kodowania Unicode i internacjonalizacji

Android wykorzystuje bibliotekę ICU i  projekt CLDR, aby zapewnić obsługę standardu Unicode i innych funkcji internacjonalizacji. Omówienie obsługi standardu Unicode i internacjonalizacji na tej stronie jest podzielone na 2 sekcje: Android 6.0 (poziom interfejsu API 23) i starsze wersje oraz Android 7.0 (poziom interfejsu API 24) i nowsze wersje.

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

Platforma Androida używa 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 internacjonalizacji 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 Androida odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 1 przedstawia te zależności do Androida 6.0 (poziom interfejsu API 23).

Tabela 1. Wersje ICU i CLDR używane w Androidzie 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 8 interfejsu API) 4.2 1.7 5.1
Android 2.3–3.0 (poziomy 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 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 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ę standardu Unicode i internacjonalizacji w przypadku aplikacji kierowanych na Androida 7.0 (poziom interfejsu API 24) lub nowszego. W następnej sekcji tej strony znajdziesz szczegółowe informacje o tej pomocy.

Obsługa standardu Unicode i internacjonalizacji na 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 deweloperom aplikacji podzbiór interfejsów API ICU4J w pakiecie android.icu. ICU4J to powszechnie używany zestaw bibliotek Java typu open source, który zapewnia obsługę standardu Unicode i internacjonalizacji w aplikacjach.

Interfejsy API ICU4J korzystają z danych lokalizacyjnych dostępnych na urządzeniu. Dzięki temu możesz zmniejszyć rozmiar aplikacji, nie kompilując w niej bibliotek ICU4J. Zamiast tego możesz wywoływać je w środowisku. 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 (interfejs API na poziomie 24) mogli pobrać wersję aplikacji zawierającą biblioteki ICU4J.

Ta sekcja zaczyna się od podstawowych informacji o minimalnych poziomach interfejsu Android API wymaganych do obsługi tych bibliotek. Następnie wyjaśnia, co musisz wiedzieć o implementacji ICU4J na Androidzie. Na koniec dowiesz się, jak używać interfejsów API ICU4J w platformie Androida.

ICU4J na Androidzie

Android udostępnia podzbiór interfejsów ICU4J API w pakiecie android.icu, a nie com.ibm.icu. Niektóre interfejsy API ICU4J nie są udostępniane przez platformę Androida, ponieważ zostały wycofane lub nie zostały uznane za stabilne. Gdy w przyszłości zespół ICU wycofa interfejsy API, Android również oznaczy je jako wycofane, ale nadal będzie je uwzględniać.

Oto kilka przypomnień:

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

Przejście z pakietu com.ibm.icu na android.icu

Jeśli używasz już interfejsów ICU4J API w aplikacji i interfejsy android.icu API spełniają Twoje wymagania, przejście na interfejsy API platformy wymaga zmiany importów Java z com.ibm.icu na android.icu. Następnie 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ą odpowiedniki w ICU4J. Jednak ICU4J często zapewnia szerszą obsługę standardów i języków.

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

Tabela 2. Klasy ICU4J w Androidzie i Javie

Klasa 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 czy libicui18n.so. Interfejsy API są dostępne od Androida 12 (poziom API 31). Nagłówki NDK są dostępne od wersji NDK r22b. Interfejs API C++ nie jest udostępniany przez Android NDK. Niektóre interfejsy API języka C są niedostępne.

Obsługa wersji

Kolejne wersje platformy Androida odpowiadają nowszym wersjom ICU oraz odpowiednim wersjom CLDR i Unicode. Tabela 3 przedstawia te zależności od Androida 7.0 (poziom API 24). Użyj interfejsu API VersionInfo.ICU_VERSION (dostępnego od Androida 7.0), aby uzyskać informacje o wersji ICU w czasie działania.

Tabela 3. Wersje ICU i CLDR używane w wersjach Androida od Androida 7.0 (poziom API 24) do Androida 15 (poziom 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 24h/12h

ICU na Androidzie nie uwzględnia ustawienia formatu czasu 24-godzinnego/12-godzinnego użytkownika, które jest pobierane z DateFormat.is24HourFormat(). Aby zastosować to ustawienie, użyj metod formatowania czasu DateFormat lub DateUtils albo wzorców formatowania czasu ICU z odpowiednimi symbolami wzorca godziny („h” dla formatu 12-godzinnego, „H” dla formatu 24-godzinnego) dla różnych wartości zwracanych przez is24HourFormat(). Na przykład ten kod generuje ciąg znaków z bieżącą godziną, który uwzględnia ustawienie 12- lub 24-godzinne 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 API 29) dostępna jest klasa Transliterator, która umożliwia transliterację 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 uzyskane z Transliterator.getAvailableIDs().

Licencjonowanie

Biblioteka ICU4J jest udostępniana na licencji ICU. Więcej informacji znajdziesz w przewodniku użytkownika ICU.