การรองรับ 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 จะแสดงชุดย่อยของ ICU4J API ให้นักพัฒนาแอปนำไปใช้ในแพ็กเกจ 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 แสดงชุดย่อยของ ICU4J API ผ่านแพ็กเกจ android.icu แทน com.ibm.icu เฟรมเวิร์ก Android ไม่ได้แสดง ICU4J API บางรายการเนื่องจากเหตุผลต่างๆ เช่น API ดังกล่าวถูกเลิกใช้งานหรือไม่ได้ประกาศว่าเสถียร เมื่อทีม ICU เลิกใช้งาน API ในอนาคต Android ก็จะทําเครื่องหมาย API เหล่านั้นว่าเลิกใช้งานด้วย แต่ยังคงรวมไว้ต่อไป

โปรดทราบข้อมูลต่อไปนี้

  • API เฟรมเวิร์ก ICU4J ของ Android ไม่ได้รวม API ทั้งหมดของ ICU4J
  • API ในเฟรมเวิร์ก Android ไม่ได้มาแทนที่การรองรับการแปลด้วยทรัพยากรของ Android
  • ในบางกรณี เฟรมเวิร์ก Android รองรับอักขระมากกว่าไลบรารี ICU เช่น การรองรับอีโมจิของคลาส android.text

ย้ายข้อมูลไปยังแพ็กเกจ android.icu จาก com.ibm.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 คลาส 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 จะแสดงชุดย่อยของ ICU4C API ผ่านไลบรารี 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) เป็นต้นไป ใช้ VersionInfo.ICU_VERSION API (ใช้ได้ตั้งแต่ Android 7.0) เพื่อรับข้อมูลเวอร์ชัน ICU ขณะรันไทม์

ตารางที่ 3 เวอร์ชัน ICU และ CLDR ที่ใช้ใน 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