ไม่มีคำตอบที่นำเสนอการทำงานสำหรับคู่ตัวแทนที่ใช้ในการเข้ารหัสอักขระด้านนอกของUnicode พื้นฐาน Multiligual เครื่องบิน
นี่คือตัวอย่างการใช้เทคนิคที่แตกต่างกันสามวิธีในการวนซ้ำ "อักขระ" ของสตริง (รวมถึงการใช้ Java 8 stream API) โปรดสังเกตว่าตัวอย่างนี้ประกอบด้วยอักขระของ Unicode Supplementary Multilingual Plane (SMP) คุณต้องมีแบบอักษรที่เหมาะสมเพื่อแสดงตัวอย่างนี้และผลลัพธ์อย่างถูกต้อง
// String containing characters of the Unicode
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";
วนซ้ำของตัวอักษร
วิธีแก้ปัญหาแรกคือการวนรอบแบบง่าย ๆchar
ของสายอักขระทั้งหมด:
/* 1 */
System.out.println(
"\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
char c = str.charAt(pos);
System.out.printf("%s ", Character.toString(c));
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
}
ทำซ้ำคะแนนรหัส
โซลูชันที่สองใช้การวนซ้ำอย่างชัดเจนเช่นกัน แต่การเข้าถึงจุดรหัสแต่ละจุดด้วยcodePointAtและการเพิ่มดัชนีการวนซ้ำตามcharCount :
/* 2 */
System.out.println(
"\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
int cp = str.codePointAt(pos);
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
pos += Character.charCount(cp);
// ^^^^^^^^^^^^^^^^^^^^^^^
// Increment pos by 1 of more depending
// the number of Java `char` required to
// encode that particular codepoint.
}
วนซ้ำรหัสจุดโดยใช้ Stream API
วิธีที่สามนั้นเหมือนกับวิธีที่สอง แต่ใช้Java 8 Stream API :
/* 3 */
System.out.println(
"\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
cp -> {
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
});
ผล
เมื่อคุณรันโปรแกรมทดสอบนั้นคุณจะได้รับ:
Using char iterator (do not work for surrogate pairs !)
T h e q u i c k b r o w n ? ? j u m p s o v e r t h e l a z y ? ? ? ? ? ? ? ?
Using Java 1.5 codePointAt(works as expected)
T h e q u i c k b r o w n 𓃥 j u m p s o v e r t h e l a z y 𓊃 𓍿 𓅓 𓃡
Using Java 8 stream (works as expected)
T h e q u i c k b r o w n 𓃥 j u m p s o v e r t h e l a z y 𓊃 𓍿 𓅓 𓃡
อย่างที่คุณเห็น (ถ้าคุณสามารถแสดงกราฟฟิคได้อย่างถูกต้อง) โซลูชันแรกไม่สามารถจัดการอักขระที่เหมาะสมนอก Unicode BMP ได้อย่างถูกต้อง ในอีกทางหนึ่งอีกสองวิธีแก้ปัญหาได้ดีกับคู่ตัวแทน