निम्नलिखित कोड पर विचार करें:हैंडलिंग यूनिकोड सरोगेट मूल्यों
byte aBytes[] = { (byte)0xff,0x01,0,0,
(byte)0xd9,(byte)0x65,
(byte)0x03,(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x17,(byte)0x33, (byte)0x74, (byte)0x6f,
0, 1, 2, 3, 4, 5,
0 };
String sCompressedBytes = new String(aBytes, "UTF-16");
for (int i=0; i<sCompressedBytes.length; i++) {
System.out.println(Integer.toHexString(sCompressedBytes.codePointAt(i)));
}
हो जाता है निम्नलिखित गलत उत्पादन:
ff01, 0, fffd, 506, 717, 3374, 6f00, 102, 304, 500.
हालांकि, अगर इनपुट डेटा में 0xd9
0x9d
करने के लिए बदल जाता है, तो निम्नलिखित सही उत्पादन प्राप्त किया जाता है:
ff01, 0, 9d65, 304, 506, 717, 3374, 6f00, 102, 304, 500.
मैं reali ज़ी है कि कार्यक्षमता इस तथ्य के कारण है कि बाइट 0xd9
एक उच्च-सरोगेट यूनिकोड मार्कर है।
प्रश्न: जावा यूनिकोड स्ट्रिंग में सरोगेट बाइट्स (0xd800
से 0xdfff
) को खिलाने, पहचानने और निकालने का कोई तरीका है?
धन्यवाद
मुझे विश्वास है कि आप सही हैं। मैं बस एक ही निष्कर्ष पर आया था लेकिन यह देखने के लिए वापस जांच की गई कि क्या कोई और जानकार पहले ही उत्तर दे चुका है या नहीं। –
सीधे शब्दों में डालने "(बाइट) 0xdc, (बाइट) 0xef," पैदावार "FF01 694ef dcef ..." है कौन सा रूप में यह होना चाहिए। –
आपके उत्तरों के लिए धन्यवाद। लेकिन, समस्या सरोगेट पात्रों को एम्बेड करने के बारे में नहीं है। जावा स्ट्रिंग में किसी भी मनमानी बाइट अनुक्रम (जो संपीड़न से आउटपुट होते हैं) को खिलाना और इसे बराबर बाइट अनुक्रम के रूप में वापस पढ़ने के लिए आवश्यकता है। –