Không có câu trả lời được đề xuất nào hoạt động cho các cặp thay thế được sử dụng để mã hóa các ký tự bên ngoài Mặt phẳng đa biến Unicode Basic .
Dưới đây là một ví dụ sử dụng ba kỹ thuật khác nhau để lặp lại các "ký tự" của chuỗi (bao gồm sử dụng API luồng Java 8). Xin lưu ý ví dụ này bao gồm các ký tự của Mặt phẳng đa ngôn ngữ bổ sung Unicode (SMP). Bạn cần một phông chữ thích hợp để hiển thị ví dụ này và kết quả chính xác.
// String containing characters of the Unicode
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";
Lặp đi lặp lại của ký tự
Giải pháp đầu tiên là một vòng lặp đơn giản trên tất cả char
các chuỗi:
/* 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
}
Lặp lại các điểm mã
Giải pháp thứ hai cũng sử dụng một vòng lặp rõ ràng, nhưng truy cập các điểm mã riêng lẻ bằng codePointAt và tăng chỉ số vòng lặp tương ứng với 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.
}
Lặp lại các điểm mã bằng API Stream
Giải pháp thứ ba về cơ bản giống như giải pháp thứ hai, nhưng sử dụng API luồng Java 8 :
/* 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
});
Các kết quả
Khi bạn chạy chương trình thử nghiệm đó, bạn có được:
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 𓊃 𓍿 𓅓 𓃡
Như bạn có thể thấy (nếu bạn có thể hiển thị chữ tượng hình đúng cách), giải pháp đầu tiên không xử lý đúng các ký tự bên ngoài Unicode BMP. Mặt khác, hai giải pháp còn lại xử lý tốt các cặp thay thế.