การรองรับ 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 โดยเฉพาะ สุดท้าย จะบอกวิธีใช้ 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