การรองรับ Unicode และการปรับให้เป็นสากล

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