2012-12-14 43 views
5

मैं एक बाहरी वेब सेवा है कि मुझे गलत तरीके से एन्कोड (और या भ्रष्ट) दे रही है स्ट्रिंग्स (UTF-8) है कि सबसे अधिक संभावना या तो ISO LATIN या WINDOWS-1252 लेकिन अब UTF-8 हैं के साथ काम कर रहा हूँ का उपयोग कर गलत तरीके से एन्कोड पाठ ठीक करने के लिए (और या आईएसओ/विन्डोज़/यूटीएफ -8 का मिश्रण)। लवली एक टोपी (Â) बहुत अधिक है।जावा पुस्तकालय heuristics

मैं स्पष्ट रूप से यह तय नहीं कर सकता कि बाहरी वेब सेवा अपने तारों को कैसे स्टोर करती है ताकि जानकारी खो जाए। इस प्रकार मुझे पता है कि 100% अनुवाद की उम्मीद संभव नहीं है।

लेकिन मुझे आशा थी कि किसी ने जावा में एक ह्यूरिस्टिक कैरेक्टर मैपिंग लाइब्रेरी लिखी होगी (इसकी संभावना है कि कोई एक टोपी टाइप करेगा)।

यदि नहीं मुझे लगता है मैं बंदरगाह इस लोग PHP कोड कर सकते हैं: https://stackoverflow.com/a/3521340/318174

अद्यतन और स्पष्टीकरण: @VGR की तरह एक साधारण रूपांतरण के साथ जवाब काम नहीं करेगा। मेरे पास मूल बाइट्स नहीं हैं। डेटा को एंडपॉइंट पर गलत रूप से परिवर्तित किया गया था (SOAP सर्वर शायद getBytes(/*with out correct encoding*/) किया गया था या हो सकता है कि डेटा गलत प्रारूप में संग्रहीत हो)। जब आप बाइट्स को जावा में स्ट्रिंग्स में कनवर्ट करते हैं तो डेटा को तब तक नहीं रखा जाता है जब तक कि एन्कोडिंग हर जगह समान न हो। अगर आप ASCII < ->UTF-8 जैसे कुछ के बारे में सोचते हैं तो यह समझना आसान है। Windows-1252 या ISO Latin के साथ यह बहुत अधिक जटिल है क्योंकि डेटा खो नहीं गया है लेकिन अक्सर उलझन में है। ऐसा इसलिए है क्योंकि उन एन्कोडिंग दो बाइट्स हो सकते हैं और UTF-8 का सबसेट नहीं हैं।

यदि आप मुझ पर विश्वास नहीं करते हैं तो आप getBytes() को विभिन्न एन्कोडिंग के साथ आगे करने का प्रयास कर सकते हैं और डेटा भ्रष्टाचार और डेटा हानि देखेंगे।

+0

मैं देना चाहिए मुझे परेशान यह हमेशा मुझे गुस्सा दिलाती है जब कुछ एक वोट बाहर एक लिखने के लिए बंद करने के लिए: यदि आप UTF-8 बाइट्स है कि अलग-अलग पात्रों के रूप में पारित किए गए है, तो आप सिर्फ ऐसा करने में सक्षम होना चाहिए टिप्पणी। –

उत्तर

0

मैं गलत तरीके से एन्कोड किए गए डेटा की प्रकृति को गलत समझा सकता हूं, लेकिन वह PHP कोड मुझे अधिक पसंद करता है। लेकिन

String fix(String s) { 
    byte[] bytes = s.getBytes(Charset.forName("windows-1252")); 
    return new String(bytes, StandardCharsets.UTF_8); 
} 
+0

यह काम नहीं करता है क्योंकि डेटा पहले से ही भ्रष्ट है। अगर मेरे पास मूल बाइट्स था तो वह काम करेगा। मेरा विश्वास करो जो आपने सूचीबद्ध किया है वह कुछ है जिसे मैं बहुत जानता हूं। –

+0

@AdamGent यह PHP कोड करता है ... हालांकि इसे आईएसओ -885 9 -1 के बजाय विंडोज -1252 का उपयोग करना चाहिए। क्या आप उदाहरण के बारे में बता सकते हैं कि आपके पास क्या है और यह क्या होना चाहिए? – Esailija

+0

आप सही हैं; कोड अपडेट किया गया। मैं सोच रहा था कि सभी यूटीएफ -8 बाइट भी आईएसओ -885 9 -1 अक्षरों के मान्य हैं, लेकिन ऐसा नहीं है। – VGR