2010-08-07 22 views
5

मैं MultiByteToWideChar() WinAPI फ़ंक्शन के साथ बाइट्स की स्ट्रीम को कन्वर्ट करने का प्रयास कर रहा हूं।बाइट्स की स्ट्रीम को दूसरे एन्कोडिंग में कैसे परिवर्तित करें?

प्रलेखन का कहना है कि कार्य अपूर्ण तारों पर ERROR_NO_UNICODE_TRANSLATION के साथ विफल रहता है (मल्टीबाइट एन्कोडेड स्ट्रिंग में कोई पिछला बाइट नहीं)। मैं इस त्रुटि को कैसे रोकूं? दिमाग में आने का एकमात्र तरीका इनपुट बफर के अंतिम मल्टीबाइट चरित्र को परिवर्तित करना नहीं है (इसे खोजने के लिए IsDBCSLeadByteEx() का उपयोग करके)।

क्या बाइट्स की धारा को परिवर्तित करने के लिए बेहतर समाधान हैं?

+0

आप कौन से कोड पेज का उपयोग करते हैं? आप किस रूप में डेटा प्राप्त करते हैं? मैं शुरुआत से अंत तक उम्मीद करता हूं और इसके विपरीत नहीं। – Oleg

+0

कोड को विंडोज प्लेटफ़ॉर्म द्वारा समर्थित सभी कोडपृष्ठों के साथ काम करना चाहिए। मुझे मल्टीबाइट या सिंगलबाइट एन्कोडिंग में डेटा प्राप्त होता है और इसे आंतरिक रूप से व्यापक रूप से संसाधित करना चाहता है, इसे आउटपुट (प्रसंस्करण के बाद) पर लोकेल-विशिष्ट एन्कोडिंग में परिवर्तित करना। – Basilevs

उत्तर

2

ऐसा लगता है कि आप इनपुट स्ट्रीम में अगली वर्ण स्थिति में जाने के लिए केवल CharNextExA का उपयोग कर सकते हैं। जिस तरह से आप MultiByteToWideChar के संबंध में यूनिकोड स्ट्रिंग में कुछ वर्ण प्राप्त कर सकते हैं और वहां एक साथ परिवर्तित कर सकते हैं। आपके पास यूनिकोड टेक्स्ट खंड होने के बाद आप इसे WideCharToMultiByte का उपयोग करके किसी अन्य कोड पृष्ठ में परिवर्तित कर सकते हैं।

UPDATED: मुझे यकीन है कि इनपुट डेटा की धारा प्राप्त करने की प्रक्रिया CharNextExA, MultiByteToWideChar और WideCharToMultiByte के लिए सम्मान के साथ डेटा की डिकोडिंग के रूप में और अधिक धीरे धीरे है हूँ। उदाहरण के लिए यदि आप WCHAR szBuffer[4096] और TCHAR szDestBuffer[4096] जैसे स्टैक पर बफर का उपयोग करते हैं तो आप 1K इनपुट डेटा को बहुत तेज़ी से डीकोड करने में सक्षम होंगे। तो मुझे लगता है कि आपके पूरे कार्यक्रम के काम करने का कुल समय इन तीन कार्यों के उपयोग से लगभग इंडेंट किया जाएगा।

इसके अलावा, मुझे यकीन नहीं है कि आपके पास कोई विकल्प है। मुझे पाठ के अंत में शुरुआत से पाठ के डीकोडिंग को शुरू करने का कोई विश्वसनीय तरीका नहीं पता है। शायद अन्य लोगों के पास एक और विचार है ...

+0

मुझे और अधिक कुशल दृष्टिकोण की आवश्यकता है - डेटा भाग बहुत बड़े हैं और मैं प्रत्येक प्रतीक के लिए फ़ंक्शन कॉल नहीं करना चाहता हूं। क्या कई कॉलों को कम करने का कोई तरीका है? – Basilevs

+1

ऐसा लगता है कि यदि आप विंडोज प्लेटफार्मों द्वारा समर्थित सभी कोडेपेज का समर्थन करना चाहते हैं तो एक और तरीका असंभव है। 'IsDBCSLeadByteEx' के प्रलेखन में आप पढ़ सकते हैं:" लीड बाइट मान प्रत्येक विशिष्ट डीबीसीएस के लिए विशिष्ट हैं। कुछ बाइट मान एक कोड पृष्ठ में एक डीबीसीएस चरित्र के लीड और ट्रेल बाइट दोनों के रूप में दिखाई दे सकते हैं। इस प्रकार, IsDBCSLeadByteEx केवल संकेत दे सकता है एक संभावित लीड बाइट मान। " तो 'CharNextExA' वाले डेटा का अनुक्रमिक स्कैन एकमात्र सुरक्षित तरीका प्रतीत होता है। बस सत्यापित करें कि आप 'CharNextExA' के उपयोग से कोई प्रदर्शन परिवर्तन भरेंगे या नहीं। यह जल्दी है। 'CharPrevExA' धीमा है – Oleg

+1

CharNextExA() के साथ पूरे बफर को संसाधित करने से CharPrevExA() के साथ 10000 बाइट बफर के अंत में 10 बाइट्स की पूंछ का विश्लेषण कर रहा है? क्या CharPrevExA को lpCurrentChar तर्क के रूप में वर्ण के मध्य को सही ढंग से दिया जा रहा है? – Basilevs

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