Tak satu pun dari jawaban yang diusulkan berfungsi untuk pasangan pengganti yang digunakan untuk menyandikan karakter di luar Unicode Basic Multiligual Plane .
Berikut adalah contoh menggunakan tiga teknik berbeda untuk beralih ke "karakter" dari string (termasuk menggunakan Java 8 stream API). Harap perhatikan contoh ini termasuk karakter dari Unicode Supplementary Multilingual Plane (SMP). Anda memerlukan font yang tepat untuk menampilkan contoh ini dan hasilnya dengan benar.
// String containing characters of the Unicode
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown π₯ jumps over the lazy ππΏπ
π‘";
Iterasi karakter
Solusi pertama adalah loop sederhana di atas semua char
string:
/* 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
}
Iterasi poin kode
Solusi kedua menggunakan loop eksplisit juga, tetapi mengakses poin kode individual dengan codePointAt dan menambah indeks loop sesuai dengan 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.
}
Iterasi lebih dari titik kode menggunakan Stream API
Solusi ketiga pada dasarnya sama dengan yang kedua, tetapi menggunakan 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
});
Hasil
Ketika Anda menjalankan program pengujian itu, Anda memperoleh:
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 π πΏ π
π‘
Seperti yang Anda lihat (jika Anda dapat menampilkan hieroglif dengan benar), solusi pertama tidak menangani karakter dengan benar di luar Unicode BMP. Di sisi lain, dua solusi lainnya menghadapi pasangan pengganti.