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 โดยเฉพาะ สุดท้าย จะบอกวิธีใช้ ICU4J API ในเฟรมเวิร์ก Android
ICU4J ใน Android
Android แสดง API ของ ICU4J บางส่วนผ่านแพ็กเกจ android.icu
แทนที่จะเป็น com.ibm.icu
เฟรมเวิร์ก Android ไม่ได้เปิดเผย API บางรายการของ ICU4J
เนื่องจากเหตุผลต่างๆ เช่น API ถูกเลิกใช้งาน
หรือไม่ได้ประกาศว่าเสถียร เมื่อทีม ICU เลิกใช้งาน API ในอนาคต
Android จะทําเครื่องหมายว่าเลิกใช้งานแล้ว แต่จะยังคงรวม API เหล่านั้นไว้ต่อไป
โปรดทราบสิ่งต่อไปนี้
- API ของเฟรมเวิร์ก ICU4J Android ไม่มี API ของ ICU4J ทั้งหมด
- API ในเฟรมเวิร์ก Android ไม่ได้มาแทนที่การรองรับของ Android สำหรับการแปลโดยใช้ ทรัพยากร
- ในบางกรณี เฟรมเวิร์ก Android รองรับอักขระมากกว่าไลบรารี ICU เช่น คลาส
android.text
รองรับอีโมจิ
ย้ายข้อมูลจาก com.ibm.icu ไปยังแพ็กเกจ android.icu
หากคุณใช้ ICU4J API ในแอปอยู่แล้ว และ 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 คลาส Android และ Java ICU4J
ชั้น | ทางเลือก |
---|---|
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 API บางรายการใน C ไม่พร้อมใช้งาน
การกำหนดเวอร์ชัน
การเปิดตัวแพลตฟอร์ม Android อย่างต่อเนื่องจะสอดคล้องกับ ICU เวอร์ชันใหม่กว่า
และ CLDR และ Unicode เวอร์ชันที่เกี่ยวข้อง ตารางที่ 3 แสดงการจับคู่นี้
ตั้งแต่ Android 7.0 (API ระดับ 24) ใช้ API
VersionInfo.ICU_VERSION
(พร้อมใช้งานตั้งแต่ 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