2013-10-11 7 views
5

मैं UTF-8 एन्कोडिंग में धारा से कुछ डेटा को पढ़नेजावा-स्ट्रिंग टूटा एन्कोडिंग

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

फिर कुछ परिणाम को

int startPos = line.indexOf(tag) + tag.length(); 
int endPos = line.indexOf("/", startPos); 

खोजने की कोशिश और इसे काट

String name = line.substring(startPos, endPos); 

अधिकांश में मामले यह ठीक काम करता है, लेकिन कुछ बार परिणाम टूट गया है। उदाहरण के लिए, "гордунни" जैसे इनपुट नाम के लिए मुझे "горд��нни", "горду��ни", "г��рдунни" आदि जैसे मान प्राप्त हुए ऐसा लगता है कि सरोगेट जोड़े कुछ कारणों से यादृच्छिक रूप से टूटा हुआ है। मुझे इसे 1000 में से 4 बार मिला।

इसे कैसे ठीक करें? क्या मुझे indexOf() + substring() के बजाय अन्य स्ट्रिंग विधियों का उपयोग करने या मेरे परिणाम पर कुछ एन्कोडिंग/डिकोडिंग जादू का उपयोग करने की आवश्यकता है?

+1

क्या यह समस्या लिनक्स पर है? आप "टूटी हुई" रेखाएं कहां देखते हैं? मुझे एसडब्ल्यूटी टेबल में भी यही समस्या थी, लेकिन जब मैं एसडब्ल्यूटी टेक्स्ट या लेबल में यह स्ट्रिंग भेजता हूं तो यह सही प्रदर्शित होता है। सबसे अधिक संभावना एक प्रदर्शित मुद्दा है। – Nicolai

+0

यह सच है कि 'इंडेक्सऑफ' और 'सबस्ट्रिंग' विधियां कोड बिंदुओं पर काम करती हैं, इसलिए संभावित रूप से वे सरोगेट जोड़े को तोड़ सकते हैं, लेकिन 'гордунни' में कोई सरोगेट जोड़े नहीं हैं! क्या आपको यकीन है कि पाठ को शुरू करने के लिए सही ढंग से पढ़ा गया था? – Joni

+0

क्या यह वही परिणाम उत्पन्न करता है यदि आप कमांड लाइन में -Dfile.encoding = UTF-8 जोड़ते हैं? – Alcanzar

उत्तर

0

इसे 'अनुत्तरित' कतार से बाहर निकालने के लिए।

समस्या तब होती है क्योंकि स्ट्रीम को बाइट्स के टुकड़ों के रूप में पढ़ा जाता था, कभी-कभी बहु-बाइट यूटीएफ -8 वर्णों को विभाजित करता था।

इनपुटस्ट्रीम रीडर में इनपुटस्ट्रीम को लपेटकर, आप वर्णों के टुकड़े (बाइट्स के टुकड़ों के विपरीत) पढ़ेंगे, और बहु-बाइट यूटीएफ -8 वर्ण जीवित रहेंगे।

-1

यदि मुझे याद है, तो यह एक हार्डवेयर समस्या हो सकती है जो बहुत आम है। कॉलेज में मेरे प्रोग्रामिंग प्रशिक्षक ने हमें बताया कि बाइनरी स्तर पर, 32 बिट 64 बिट आदि के साथ .. किसी भी प्रकार का पीसी, कंप्यूटिंग के दौरान एक लाइन से दूसरी तरफ कूदने लगता है, इसका परिणाम गलत परिणाम हो सकता है, यानी जावा में युगल के लिए , मेरे कई दोस्तों को 2.0 चीजों की बजाय 1.99 99 99 99 99 993435 मिलेगा।

क्या आपने यह सुनिश्चित करने के लिए किसी अन्य पीसी पर अपना कोड चलाने का प्रयास किया है? मैं पूरी तरह से गलत है, मैं सबसे जानकार व्यक्ति जब यह इन

+0

यह फ़्लोटिंग पॉइंट मानों के इन-मेमोरी प्रस्तुति के साथ करना है और इस प्रश्न के साथ कुछ लेना देना नहीं है। –

0

अपने उदाहरण में जैसे प्रश्नों के लिए आता है नहीं कर रहा हूँ, तुम, bytearray की सामग्री दिखा सकते हैं लाइन की और टैग के हो सकता है? क्या आप यह भी दिखा सकते हैं कि किस लंबाई को प्राप्त किया जाएगा, क्या शुरू होता है और क्या अंत? मेरा मतलब है, स्ट्रिंग के भीतर "гордунни" कोई "/" नहीं है! और आप endPos की गणना क्यों करते हैं? टैग के अंदर स्ट्रिंग क्या है? क्या आप सुनिश्चित हैं कि सबस्ट्रिंग का दूसरा पैरामीटर एंडोप्स है और लंबाई नहीं है? यह सच है कि "гордунни" को कोई सरोगेट जोड़े की आवश्यकता नहीं है क्योंकि सभी कोडपॉइंट 0xFFFF से नीचे हैं, लेकिन एक बार कहीं भी आपके यूटीएफ -16 स्ट्रिंग में कम से कम एक सरोगेट-जोड़ी है, मैं शर्त लगाता हूं कि स्ट्रिंग की लंबाई आपको शब्द की संख्या देगी तत्व और कोडपॉइंट्स की संख्या नहीं। मुझे जावा के बारे में निश्चित नहीं है, लेकिन सी # लंबाई में आपको तत्वों की संख्या मिलती है। अक्षर/कोडपॉइंट्स की संख्या प्राप्त करने के लिए आपको C# में StringInfo क्लास का उपयोग करना होगा। अगर आपके स्ट्रिंग में कुछ बीओएम होगा तो भी जांचें।


स्ट्रिंग लाइन = नया स्ट्रिंग (बाइटएरे, "यूटीएफ -8");

कर रहे हैं? बाइट सरणी एक utf-8 एन्कोडेड स्ट्रिंग utf-16 में परिवर्तित हो रही है? क्या इसमें एक यूटीएफ -8 बीओएम है? क्या स्ट्रिंग के बाद एक utf-16LE या utf-16BE BOM है?

+0

बीओएम के बारे में प्रश्न पूछें स्ट्रिंग को यूटीएफ -16 स्ट्रिंग के रूप में एन्कोड किया जाएगा, जिसमें केवल बीओएम होगा यदि यूटीएफ -8 स्ट्रिंग में बीओएम था (जो कि उस स्पेक के अनुसार होना चाहिए) –

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