প্রস্তাবিত উত্তরগুলির কোনওটিই ইউনিকোড বেসিক মাল্টিলিগুয়াল প্লেনের বাইরে অক্ষরগুলি এনকোড করতে ব্যবহৃত সারোগেট জোড়গুলির জন্য কাজ করে না ।
একটি স্ট্রিংয়ের "অক্ষর" (পুনরায় জাভা 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.
}
স্ট্রিম এপিআই ব্যবহার করে কোড পয়েন্ট ওভারেট করুন
তৃতীয় সমাধানটি মূলত দ্বিতীয়টির মতো তবে জাভা 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 𓊃 𓍿 𓅓 𓃡
আপনি দেখতে পাচ্ছেন (আপনি যদি হায়রোগ্লিফগুলি সঠিকভাবে প্রদর্শন করতে সক্ষম হন), প্রথম সমাধানটি ইউনিকোড বিএমপির বাইরে সঠিকভাবে অক্ষরগুলি পরিচালনা করে না। অন্যদিকে, অন্য দুটি সমাধান সারোগেট জোড়গুলির সাথে ভালভাবে ডিল করে।