Hỗ trợ Unicode và quốc tế hoá

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Android tận dụng thư viện ICUdự án CLDR để cung cấp hỗ trợ của Unicode và các công cụ quốc tế hoá khác. Tài liệu thảo luận của tài liệu này về hỗ trợ Unicode và quốc tế hoá được chia thành hai phần: Android 6.0 (API cấp 23) trở xuống và Android 7.0 (API cấp 24) trở lên.

Hỗ trợ Unicode và quốc tế hoá qua Android 6.0 (API cấp 23)

Nền tảng Android sử dụng ICU và CLDR để triển khai nhiều lớp cho việc xử lý cả các ngôn ngữ chính thống Latinh và không phải La tinh, hiển thị các lớp như Locale, Character và nhiều lớp con của java.text . Một ứng dụng yêu cầu chức năng quốc tế hoá ngoài các lớp hiển thị và nhắm mục tiêu các phiên bản của nền tảng thông qua Android 6.0 (API cấp 23), phải bao gồm thư viện ICU.

Lập phiên bản.

Các bản phát hành tiếp theo của nền tảng Android tương ứng với các phiên bản ICU mới hơn (và các phiên bản CLDR và Unicode tương ứng). Bảng 1 cho thấy sự tương ứng này thông qua Android 6.0 (API cấp 23).

Bảng 1. Các phiên bản ICU và CLDR được sử dụng thông qua Android 6.0 (API cấp 23).

Nền tảng (cấp độ API) ICU CLDR Unicode
Android 1.5–2.0 (API cấp 3–7) 3.8 1.5 5.0
Android 2.2 (API cấp 8) 4.2 1.7 5.1
Android 2.3–3.0 (API cấp 9–13) 4.4 1.8 5.2
Android 4.0 (API cấp 14–15) 4.6 1.9 6.0
Android 4.1 (API cấp 16–17) 4.8 2.0 6.0
Android 4.3 (API cấp 18) 50 22.1 6.2
Android 4.4 (API cấp 19–20) 51 23 6.2
Android 5.0 (API cấp 21–22) 53 25 6.3
Android 6.0 (API level 23) 55.1 27.0.1 7.0

Các ứng dụng hướng đến Android 7.0 (API cấp 24) trở lên có thể tận dụng hỗ trợ toàn diện hơn cho Unicode và quốc tế hoá mà khung Android hiển thị. Phần tiếp theo của tài liệu này sẽ cung cấp thông tin chi tiết về hỗ trợ đó.

Hỗ trợ Unicode và quốc tế hoá trong Android 7.0 (API cấp 24) trở lên

Kể từ Android 7.0 (API cấp 24), nền tảng Android sẽ hiển thị một tập hợp con các API ICU4J để các nhà phát triển ứng dụng sử dụng trong gói android.icu. ICU4J là một nhóm thư viện Java nguồn mở, được sử dụng rộng rãi đồng thời cung cấp hỗ trợ Unicode và quốc tế hoá cho các ứng dụng phần mềm.

API ICU4J sử dụng dữ liệu bản địa hoá có trên thiết bị. Do đó, bạn có thể giảm dấu vết của ứng dụng bằng cách không biên dịch các thư viện ICU4J vào ứng dụng của mình; thay vào đó, bạn chỉ cần gọi các thư viện này trong khung. (Trong trường hợp này, bạn nên cung cấp nhiều phiên bản APK, để người dùng chạy các phiên bản Android thấp hơn Android 7.0 (API cấp 24) có thể tải phiên bản ứng dụng chứa các thư viện ICU4J.)

Tài liệu này bắt đầu bằng cách cung cấp một số thông tin cơ bản về các cấp API Android tối thiểu cần có để hỗ trợ các thư viện này. Sau đó, tài liệu này giải thích những điều bạn cần biết về cách triển khai ICU4J dành riêng cho Android. Cuối cùng, tài liệu này sẽ hướng dẫn bạn cách sử dụng các API ICU4J trong khung Android.

ICU4J trên Android

Android sẽ hiển thị một tập hợp con các API ICU4J thông qua gói android.icu thay vì com.ibm.icu. Khung Android có thể chọn không hiển thị các API ICU4J vì nhiều lý do, chẳng hạn như vì API không được dùng nữa hoặc không được khai báo ổn định. Vì nhóm ICU sẽ ngừng sử dụng các API trong tương lai nên Android cũng sẽ đánh dấu các API đó là không được dùng nữa, nhưng vẫn tiếp tục đưa các API đó vào.

Sau đây là một số điều quan trọng cần lưu ý:

  • API khung Android ICU4J không bao gồm tất cả các API ICU4J.
  • Các API trong khung Android không thay thế khả năng hỗ trợ của Android để bản địa hoá tài nguyên.
  • Trong một số trường hợp, khung Android hỗ trợ nhiều ký tự hơn các thư viện ICU. Ví dụ: điều này đúng với sự hỗ trợ của lớp android.text cho biểu tượng cảm xúc.

Di chuyển sang gói android.icu từ com.ibm.icu

Nếu bạn đang sử dụng API ICU4J trong ứng dụng và API android.icu đáp ứng các yêu cầu của bạn, thì việc di chuyển sang API khung sẽ yêu cầu bạn thay đổi dữ liệu nhập Java từ com.ibm.icu sang android.icu. Sau đó, bạn có thể xoá bản sao tệp ICU4J của riêng mình khỏi ứng dụng.

Lưu ý: API khung ICU4J sử dụng không gian tên android.icu thay vì com.ibm.icu. Điều này nhằm tránh xung đột không gian tên trong các ứng dụng chứa thư viện com.ibm.icu của riêng ứng dụng đó.

Di chuyển sang API android.icu từ các API SDK Android khác

Một số lớp trong gói javaandroid có các lớp tương đương với các lớp được tìm thấy trong ICU4J. Tuy nhiên, ICU4J thường cung cấp hỗ trợ rộng rãi hơn cho các tiêu chuẩn và ngôn ngữ.

Bảng 2 cho thấy một số ví dụ về những trường hợp tương đương để giúp bạn có thể bắt đầu làm quen:

Bảng 2.Các lớp ICU4J của Android và Java

Lớp Lựa chọn thay thế
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 trên Android

Android hiển thị một tập hợp con các API ICU4C thông qua thư viện libicu.so thay vì libicuuc.so hoặc libicui18n.so. Các API này có sẵn kể từ Android 12 (API cấp 31). Các tiêu đề NDK có sẵn kể từ bản phát hành NDK r22b. Không có API C++ nào được hiển thị trên Android NDK. Một số API C vẫn chưa có sẵn.

Lập phiên bản.

Các bản phát hành tiếp theo của nền tảng Android tương ứng với các phiên bản ICU mới hơn (và các phiên bản CLDR và Unicode tương ứng). Bảng 3 cho thấy sự tương ứng này từ Android 7.0 (API cấp 24).

Bảng 3. Các phiên bản ICU và CLDR được sử dụng trong Android 7.0 (API cấp 24) trở lên.

Nền tảng (cấp độ API) ICU CLDR Unicode
Android 7.0 - 7.1 (API cấp 24 - 25) 56 28 8.0
Android 8.0 - 8.1 (API cấp 26 - 27) 58.2 30.0.3 9.0
Android 9 (API cấp 28) 60.2 32.0.1 10.0
Android 10 (API cấp 29) 63.2 34 11.0
Android 11 (API cấp 30) 66.1 36 13.0
Android 12 (API cấp 31) 68.2 38.1 13.0

Chế độ cài đặt định dạng thời gian 24h/12h

ICU trên Android không tuân theo chế độ cài đặt định dạng thời gian 24h/12h của người dùng (lấy từ DateFormat.is24HourFormat()). Để tuân theo cài đặt, hãy sử dụng các phương thức định dạng thời gian DateFormat hoặc DateUtils, hoặc sử dụng các mẫu định dạng thời gian ICU với biểu tượng mẫu giờ thích hợp ('h' trong 12 giờ, "H" trong 24 giờ) cho các giá trị trả về is24HourFormat() khác nhau. Ví dụ: mã này sẽ tạo một chuỗi có thời gian hiện tại tuân theo chế độ cài đặt 12h/24h của người dùng:

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

Tính ổn định của bộ chuyển ngữ

Kể từ Android 10 (API cấp 29), Transliterator sẽ được cung cấp để chuyển văn bản từ định dạng này sang định dạng khác. Bộ mã chuyển ngữ có sẵn không ổn định trên các bản phát hành và thiết bị Android. Nhà sản xuất thiết bị có thể thêm mã chuyển ngữ bổ sung. Nhà phát triển phải kiểm tra các mã nhận dạng có sẵn (lấy từ Transliterator.getAvailableIDs()) trước khi chuyển văn bản.

Cấp phép

ICU4J được phát hành theo giấy phép ICU. Để biết thông tin chi tiết, vui lòng xem Hướng dẫn sử dụng ICU.