Android ใช้ไลบรารี ICU และโปรเจ็กต์ CLDR เพื่อรองรับ Unicode และการปรับให้เป็นสากลอื่นๆ การอภิปรายเกี่ยวกับการรองรับ Unicode และการปรับให้เป็นสากลในหน้านี้แบ่งออกเป็น 2 ส่วน ได้แก่ Android 6.0 (API ระดับ 23) และต่ำกว่า และ Android 7.0 (API ระดับ 24) ขึ้นไป
การรองรับ Unicode และการปรับให้เป็นสากลผ่าน Android 6.0 (API ระดับ 23)
แพลตฟอร์ม Android ใช้ ICU และ CLDR เพื่อใช้คลาสต่างๆ
ในการจัดการทั้งการสะกดคำแบบละตินและแบบที่ไม่ใช่ละติน โดยจะแสดงคลาสต่างๆ
เช่น Locale
, Character
และคลาสย่อยจำนวนมากของ
java.text
แอปที่ต้องใช้ฟังก์ชันการปรับให้เป็นสากลนอกเหนือจากคลาสที่แสดง และกำหนดเป้าหมายเป็นแพลตฟอร์มเวอร์ชันต่างๆ ผ่าน Android 6.0
(API ระดับ 23) จะต้องมีไลบรารี ICU
การกำหนดเวอร์ชัน
การเปิดตัวแพลตฟอร์ม Android อย่างต่อเนื่องจะสอดคล้องกับ ICU เวอร์ชันใหม่กว่าและ CLDR และ Unicode เวอร์ชันที่เกี่ยวข้อง ตารางที่ 1 แสดงความสอดคล้องนี้ผ่าน Android 6.0 (API ระดับ 23)
ตารางที่ 1 เวอร์ชัน ICU และ CLDR ที่ใช้ผ่าน Android 6.0 (API ระดับ 23)
แพลตฟอร์ม (ระดับ API) | ICU | CLDR | Unicode |
---|---|---|---|
Android 1.5-2.0 (API ระดับ 3-7) | 3.8 | 1.5 | 5.0 |
Android 2.2 (API ระดับ 8) | 4.2 | 1.7 | 5.1 |
Android 2.3-3.0 (API ระดับ 9-13) | 4.4 | 1.8 | 5.2 |
Android 4.0 (API ระดับ 14-15) | 4.6 | 1.9 | 6.0 |
Android 4.1 (API ระดับ 16-17) | 4.8 | 2.0 | 6.0 |
Android 4.3 (API ระดับ 18) | 50 | 22.1 | 6.2 |
Android 4.4 (API ระดับ 19-20) | 51 | 23 | 6.2 |
Android 5.0 (API ระดับ 21-22) | 53 | 25 | 6.3 |
Android 6.0 (API ระดับ 23) | 55.1 | 27.0.1 | 7.0 |
เฟรมเวิร์ก Android รองรับ Unicode และการปรับให้เป็นสากลอย่างครอบคลุมมากขึ้นสำหรับแอปที่กำหนดเป้าหมายเป็น Android 7.0 (API ระดับ 24) ขึ้นไป ส่วนถัดไปของหน้านี้จะให้รายละเอียดเกี่ยวกับการรองรับดังกล่าว
การรองรับ Unicode และการปรับให้เป็นสากลใน Android 7.0 (API ระดับ 24) ขึ้นไป
สำหรับ Android 7.0 (API ระดับ 24) ขึ้นไป แพลตฟอร์ม Android
จะแสดง API ของ ICU4J บางส่วนให้นักพัฒนาแอปใช้ภายใต้แพ็กเกจ android.icu
โดย ICU4J เป็นชุดไลบรารี Java แบบโอเพนซอร์สที่ใช้กันอย่างแพร่หลาย ซึ่งรองรับ Unicode
และการปรับให้เป็นสากลสำหรับแอปพลิเคชันซอฟต์แวร์
API ของ ICU4J ใช้ข้อมูลการแปลที่มีอยู่ในอุปกรณ์ ด้วยเหตุนี้ คุณจึงลดขนาดข้อมูลของแอปได้โดยไม่ต้องคอมไพล์ไลบรารี ICU4J ลงในแอป แต่ให้เรียกใช้ไลบรารีเหล่านั้นในเฟรมเวิร์กแทน หากทำเช่นนี้ คุณอาจต้องระบุ APK หลายเวอร์ชัน เพื่อให้ผู้ใช้ที่ใช้ Android เวอร์ชันต่ำกว่า Android 7.0 (API ระดับ 24) ดาวน์โหลดแอปเวอร์ชันที่มีไลบรารี ICU4J ได้
ส่วนนี้เริ่มต้นด้วยการให้ข้อมูลพื้นฐานเกี่ยวกับระดับ API ขั้นต่ำของ Android ที่จำเป็นต่อการรองรับไลบรารีเหล่านี้ จากนั้นจะอธิบายสิ่งที่คุณต้องรู้เกี่ยวกับการใช้งาน ICU4J สำหรับ Android โดยเฉพาะ สุดท้าย จะบอกวิธีใช้ API ของ ICU4J ในเฟรมเวิร์ก Android
ICU4J ใน Android
Android แสดง API ของ ICU4J บางส่วนผ่านแพ็กเกจ android.icu
แทนที่จะเป็น com.ibm.icu
เฟรมเวิร์ก Android ไม่ได้เปิดเผย API บางอย่างของ ICU4J
เนื่องจากเหตุผลต่างๆ เช่น API ถูกเลิกใช้งาน
หรือไม่ได้ประกาศว่าเสถียร เมื่อทีม ICU เลิกใช้งาน API ในอนาคต
Android จะทําเครื่องหมายว่าเลิกใช้งานแล้ว แต่จะยังคงรวม API เหล่านั้นไว้ต่อไป
โปรดทราบสิ่งต่อไปนี้
- API เฟรมเวิร์ก Android ของ ICU4J ไม่ได้รวม API ของ ICU4J ไว้ทั้งหมด
- API ในเฟรมเวิร์ก Android ไม่ได้มาแทนที่การรองรับการแปลโดยใช้แหล่งข้อมูลของ Android
- ในบางกรณี เฟรมเวิร์ก Android รองรับอักขระมากกว่าไลบรารี ICU ซึ่งพบได้ในกรณีเช่นการรองรับอิโมจิของคลาส
android.text
ย้ายข้อมูลจาก com.ibm.icu ไปยังแพ็กเกจ android.icu
หากคุณใช้ API ของ ICU4J ในแอปอยู่แล้ว และ android.icu
API ตรงตามข้อกำหนดของคุณ การย้ายข้อมูลไปยัง
API ของเฟรมเวิร์กกำหนดให้คุณต้องเปลี่ยนการนำเข้า Java
จาก com.ibm.icu
เป็น android.icu
จากนั้นคุณจะนำสำเนาไฟล์ ICU4J ของคุณเองออกจากแอปได้
หมายเหตุ: API เฟรมเวิร์กของ ICU4J ใช้เนมสเปซ android.icu
แทน com.ibm.icu
เพื่อหลีกเลี่ยงข้อขัดแย้งของเนมสเปซในแอปที่มีไลบรารี com.ibm.icu
ของตัวเอง
ย้ายข้อมูลไปยัง API ของ android.icu จาก API อื่นๆ ของ Android SDK
คลาสบางคลาสในแพ็กเกจ java
และ android
เทียบเท่ากับคลาสที่พบใน ICU4J อย่างไรก็ตาม ICU4J มักจะรองรับมาตรฐานและภาษาที่กว้างกว่า
ตารางที่ 2 แสดงตัวอย่างความเทียบเท่าเหล่านี้เพื่อช่วยให้คุณเริ่มต้นใช้งานได้
ตารางที่ 2 คลาส ICU4J ของ Android และ Java
คลาส | ทางเลือก |
---|---|
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 ใน Android
Android แสดง API ของ ICU4C บางส่วนผ่านไลบรารี libicu.so
แทนที่จะเป็น libicuuc.so
หรือ libicui18n.so
โดย API จะพร้อมใช้งานตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป ส่วนหัว NDK พร้อมใช้งานตั้งแต่ NDK รุ่น r22b เป็นต้นไป
ไม่มี C++ API ที่แสดงผ่าน Android NDK และ C API บางรายการไม่พร้อมใช้งาน
การกำหนดเวอร์ชัน
การเปิดตัวแพลตฟอร์ม Android อย่างต่อเนื่องจะสอดคล้องกับ ICU เวอร์ชันใหม่กว่าและ CLDR และ Unicode เวอร์ชันที่เกี่ยวข้อง ตารางที่ 3 แสดงความสอดคล้องนี้ตั้งแต่ Android 7.0 (API ระดับ 24) เป็นต้นไป ให้ใช้ VersionInfo.ICU_VERSION
API (พร้อมใช้งานตั้งแต่ Android 7.0) เพื่อรับข้อมูลเวอร์ชัน ICU
ในขณะรันไทม์
ตารางที่ 3 เวอร์ชัน ICU และ CLDR ที่ใช้ใน Android เวอร์ชันต่างๆ ตั้งแต่ Android 7.0 (API ระดับ 24) จนถึง Android 15 (API ระดับ 35)
แพลตฟอร์ม (ระดับ API) | ICU | CLDR | Unicode |
---|---|---|---|
Android 7.0-7.1 (API ระดับ 24-25) | 56 | 28 | 8.0 |
Android 8.0-8.1 (API ระดับ 26-27) | 58.2 | 30.0.3 | 9.0 |
Android 9 (API ระดับ 28) | 60.2 | 32.0.1 | 10.0 |
Android 10 (API ระดับ 29) | 63.2 | 34 | 11.0 |
Android 11 (API ระดับ 30) | 66.1 | 36 | 13.0 |
Android 12 (API ระดับ 31-32) | 68.2 | 38.1 | 13.0 |
Android 13 (API ระดับ 33) | 70.1 | 40 | 14.0 |
Android 14 (API ระดับ 34) | 72.1 | 42 | 15.0 |
Android 15 (API ระดับ 35) | 75.1 | 45 | 15.1 |
การตั้งค่ารูปแบบเวลา 24 ชั่วโมง/12 ชั่วโมง
ICU ใน Android ไม่ได้ใช้การตั้งค่ารูปแบบเวลา 24 ชั่วโมง/12 ชั่วโมงของผู้ใช้ ซึ่งได้มาจากDateFormat.is24HourFormat()
หากต้องการให้เป็นไปตามการตั้งค่านี้ ให้ใช้เมธอดการจัดรูปแบบเวลา DateFormat
หรือ DateUtils
หรือใช้รูปแบบการจัดรูปแบบเวลา ICU ที่มีสัญลักษณ์รูปแบบชั่วโมงที่เหมาะสม ("h" สำหรับ 12 ชั่วโมง "H" สำหรับ 24 ชั่วโมง) สำหรับค่าที่ส่งคืน is24HourFormat()
ที่แตกต่างกัน
ตัวอย่างเช่น โค้ดนี้จะสร้างสตริงที่มีเวลาปัจจุบันตามการตั้งค่า 12 ชั่วโมง/24 ชั่วโมงของผู้ใช้
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());
ความเสถียรของโปรแกรมทับศัพท์
ตั้งแต่ Android 10 (API ระดับ 29) เป็นต้นไปTransliterator
จะพร้อมใช้งานเพื่อทับศัพท์ข้อความจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง ชุดรหัสการทับศัพท์ที่ใช้ได้ไม่เสถียรในอุปกรณ์และรุ่นต่างๆ ของ Android ผู้ผลิตอุปกรณ์อาจเพิ่มรหัสการทับศัพท์เพิ่มเติม นักพัฒนาแอปต้องตรวจสอบรหัสที่ใช้ได้ซึ่งได้รับจาก
Transliterator.getAvailableIDs()
ก่อนที่จะทับศัพท์ข้อความ
การอนุญาตให้ใช้สิทธิ
ICU4J เผยแพร่ภายใต้ใบอนุญาต ICU โปรดดูรายละเอียดในคู่มือผู้ใช้ ICU