प्रस्तावित उत्तरों में से कोई भी यूनिकोड बेसिक मल्टीलीग्युअल प्लेन के बाहर वर्णों को एनकोड करने के लिए इस्तेमाल किए गए सरोगेट जोड़े के लिए काम करता है ।
यहाँ एक स्ट्रिंग के "वर्ण" पर झुकाव के लिए तीन अलग-अलग तकनीकों का उपयोग करके एक उदाहरण है (incl। Java 8 स्ट्रीम एपीआई का उपयोग करके)। कृपया ध्यान दें कि इस उदाहरण में यूनिकोड अनुपूरक बहुभाषी विमान (एसएमपी) के अक्षर शामिल हैं। इस उदाहरण और परिणाम को सही ढंग से प्रदर्शित करने के लिए आपको एक उचित फ़ॉन्ट की आवश्यकता है।
// 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
}
कोड बिंदुओं का फेरबदल
दूसरा समाधान एक स्पष्ट लूप का भी उपयोग करता है, लेकिन कोडपॉइंट के साथ अलग-अलग कोड पॉइंट एक्सेस करना और चार्ट के अनुसार लूप इंडेक्स को बढ़ाना :
/* 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.
}
स्ट्रीम एपीआई का उपयोग करके कोड बिंदुओं पर Iterate करें
तीसरा समाधान मूल रूप से दूसरे के समान है, लेकिन जावा 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
});
परिणाम
जब आप उस परीक्षण कार्यक्रम को चलाते हैं, तो आप प्राप्त करते हैं:
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 𓊃 𓍿 𓅓 𓃡
जैसा कि आप देख सकते हैं (यदि आप चित्रलिपि को ठीक से प्रदर्शित करने में सक्षम हैं), तो पहला समाधान यूनिकोड बीएमपी के बाहर ठीक से वर्णों को नहीं संभालता है। दूसरी ओर, अन्य दो समाधान सरोगेट जोड़े के साथ अच्छी तरह से व्यवहार करते हैं।