2015-06-01 15 views
7

हमने हाल ही में जेडीके 7 से जेडीके 8 पर अपना आवेदन माइग्रेट किया है। परिवर्तन के बाद, हम कोड के निम्नलिखित स्निपेट के साथ एक समस्या में भाग गए।यूटीएफ -8 डिकोडिंग में जावा 8 परिवर्तन

String output = new String(byteArray, "UTF-8"); 

बाइट सरणी में अवैध यूटीएफ -8 बाइट अनुक्रम हो सकते हैं। UTF-8 डिकोडिंग पर एक ही बाइट सरणी, जावा 7 और जावा 8.

पर दो अंतर तार में परिणाम answer को यह SO post, जावा 8 "फिक्स" जावा 7 में किसी त्रुटि के अनुसार और की जगह अवैध UTF-8 एक प्रतिस्थापन स्ट्रिंग के साथ बाइट अनुक्रम, जो यूटीएफ -8 विनिर्देश के अनुसार है।

लेकिन हम डीकोडेड स्ट्रिंग के जावा 7 के संस्करण के साथ रहना चाहते हैं।

हम CodingErrorAction साथ CharsetDecoder उपयोग करने के लिए के रूप में बदलें, रिपोर्ट और जावा 8. फिर भी पर ध्यान न दें की कोशिश की है, हम जावा के रूप में ही स्ट्रिंग उचित की एक तकनीक के साथ 7.

हम यह कर सकता उत्पन्न करने में सक्षम नहीं थे जटिलता?

+2

कृपया सटीक इनपुट 'बाइटएरे' (इससे न्यूनतम अंश) पोस्ट करें, ताकि हम आपकी समस्या का पुनरुत्पादन कर सकें। –

+1

यदि आपकी समस्या वास्तव में है कि गलत तरीके से एन्कोडेड सरोगेट जोड़े हैं, तो 'कोडिंग एररएक्शन' आपकी मदद नहीं करेगा। 'यूटीएफ -8' और' संशोधित यूटीएफ -8 'के बारे में सोचें, जो कि पूरी तरह से अलग-अलग एन्कोडिंग हैं। उस स्थिति में आप किसी अन्य एन्कोडिंग पर स्विच करने में त्रुटि पुनर्प्राप्ति विकल्प की अपेक्षा नहीं करेंगे, है ना? तो आपको तब क्या चाहिए, एक वैकल्पिक 'वर्णसेट' कार्यान्वयन है, लेकिन यह लिंक किए गए उत्तर की पांच पंक्तियों से आसान नहीं होगा। – Holger

+0

@ होल्गर मुझे यकीन नहीं है कि "केवल" गलत तरीके से एन्कोडेड सरोगेट जोड़े हैं, कोड वास्तव में इस नए स्ट्रिंग (एचएमएसी.डोफिनल (बाइटएरे), "यूटीएफ -8" जैसे कुछ करता है)। यहां एचएमएसी मैक का एक उदाहरण है। यह किसी भी वैध यूटीएफ -8 एन्कोडेड स्ट्रिंग (इसके कुछ हिस्सों) से भी नहीं है। यदि हम दूसरे पोस्ट में उल्लिखित समाधान का पालन करते हैं, तो हमें अमान्य यूटीएफ -8 अक्षरों के लिए अपवाद मिलता है। – Jiraiya

उत्तर

7

@ होल्गर द्वारा प्रदान किए गए पॉइंटर्स से, यह स्पष्ट था कि हमें कस्टम चार्टसेट डिकोडर लिखना था।

मैं sun.nio.cs.UTF_8 वर्ग के OpenJDK के संस्करण की प्रतिलिपि बनाई, CustomUTF_8 को यह नाम दिया गया और इसका इस्तेमाल तो

String output = new String(bytes, new CustomUTF_8()); 

इस तरह की स्ट्रिंग के निर्माण के लिए मैं व्यापक परीक्षण उत्पन्न आउटपुट की पुष्टि करने को पार चलाना चाहते हैं जावा 7 और जावा 8 पर। यह एक अंतरिम समाधान है जबकि मैं एचएमएसी से आउटपुट पास करने की वास्तविक समस्या को सीधे 6464 एन्कोडिंग के बिना स्ट्रिंग तक ठीक करने की कोशिश कर रहा हूं।

String output = new String(Base64.Encoder.encode(bytes), Charset.forname("UTF-8")); 
+0

यदि परीक्षण अच्छी तरह से चला जाता है, तो इसे लाइब्रेरी के रूप में रिलीज़ करना और मेवेन में रखना अच्छा विचार होगा केंद्रीय, इसलिए एक ही समस्या वाले अन्य लोग इसका उपयोग कर सकते हैं। –

+0

@TagirValeev मुझे लगता है कि यह लोगों के लिए ऐसा करना आसान बनाने के लिए एक बुरा विचार है। CharsetDecoder क्लास एक विशिष्ट वर्णमाला में सोलह-बिट यूनिकोड वर्णों के क्रम में बाइट्स के अनुक्रम का अनुवाद करता है। इस स्तर पर पैच काम खतरनाक है क्योंकि मुझे यह सुनिश्चित नहीं हो सकता है कि जेवीएम के दो संस्करणों में सोलह-बिट यूनिकोड वर्णों का अनुक्रम व्याख्या किया गया है। – Jiraiya

संबंधित मुद्दे