2012-05-03 16 views
5

यदि मैं स्ट्रिंग के एक टुकड़े को यूटीएफ -16 में परिवर्तित करना चाहता हूं, तो char * xmlbuffer कहें, क्या मुझे यूटीएफ -16 में एन्कोडिंग से पहले wchar_t * में प्रकार को परिवर्तित करना होगा? और char* यूटीएफ -8 में एन्कोडिंग से पहले पुनः प्राप्त किया गया है?wchar_t और एन्कोडिंग

wchar_t, char यूटीएफ -8 या यूटीएफ -16 या यूटीएफ -32 या अन्य परिवर्तन प्रारूप से संबंधित कैसे है?

मदद के लिए अग्रिम धन्यवाद!

उत्तर

4

नहीं, आपको डेटा प्रकारों को बदलने की ज़रूरत नहीं है।

बारे wchar_t: मानक का कहना है कि

प्रकार wchar_t अलग प्रकार जिनके मान निर्दिष्ट समर्थित स्थानों के बीच सबसे बड़ा विस्तारित वर्ण सेट के सभी सदस्यों के लिए अलग कोड का प्रतिनिधित्व कर सकते हैं।

दुर्भाग्य से, यह नहीं कहता कि wchar_t क्या एन्कोडिंग होना चाहिए; यह कार्यान्वयन-निर्भर है। उदाहरण के लिए दिए गए

auto s = L"foo"; 

आप कर सकते हैं क्या अभिव्यक्ति *s का मूल्य है के बारे में बिल्कुल नहीं धारणा बनाते हैं।

हालांकि, आप std::string का उपयोग बाइट्स के एक अपारदर्शी अनुक्रम के रूप में कर सकते हैं जो बिना किसी समस्या के आपकी पसंद के किसी भी रूपांतरण प्रारूप में टेक्स्ट का प्रतिनिधित्व करता है। बस मानक लाइब्रेरी स्ट्रिंग से संबंधित संचालन न करें।

+0

तो क्या मैं कह सकता हूं कि विंडोज प्लेटफ़ॉर्म में यूटीएफ -16 के लिए wchar_t का उपयोग करना सुविधा के लिए पसंद का मामला है, आप सिद्धांत में यूटीएफ -16 के लिए बिल्कुल उपयोग कर सकते हैं? – Hunter

+0

@Hunter: सिद्धांत रूप में हाँ, लेकिन विंडोज़ में, 'wchar_t' का उपयोग यूटीएफ -16 के लिए किया जाता है, और ASCII और UTF-8 के लिए' char'। –

+0

विंडोज़ पर, 'wchar_t' का 16 ज्ञात –

1

wchar_t का आकार संकलक निर्भर है, इसलिए विभिन्न यूनिकोड प्रारूपों के साथ इसका संबंध अलग-अलग होगा।

4

iconv एक पॉज़िक्स फ़ंक्शन है जो इंटरमीडिएट एन्कोडिंग चरण का ख्याल रख सकता है। आप iconv_open का उपयोग यह निर्दिष्ट करने के लिए कर सकते हैं कि आपके पास यूटीएफ -8 इनपुट है और आप यूटीएफ -16 आउटपुट चाहते हैं। फिर, हैंडल का उपयोग iconv_open से लौटा, आप iconv (अपने इनपुट बफर और आउटपुट बफर निर्दिष्ट कर सकते हैं) का उपयोग कर सकते हैं। जब आप कर रहे हैं आप संभाल iconv_open से मुक्त संसाधनों आदि

आप क्या एन्कोडिंग iconv द्वारा समर्थित हैं और उनके नामकरण योजना (अर्थात क्या iconv_open प्रदान करने के लिए) के बारे में आपके सिस्टम के प्रलेखन से पढ़ने की आवश्यकता होगी के लिए लौट आए पर iconv_close कॉल करना होगा। उदाहरण के लिए, iconv कुछ सिस्टम पर "utf-8" उम्मीद और दूसरों यह उम्मीद "UTF8" आदि

विंडोज iconv का एक संस्करण प्रदान नहीं करता है हो सकता है, और इसके बजाय यह खुद को UTF स्वरूपण कार्यों है प्रदान करता है: MultiByteToWideChar और WideCharToMultiByte

//UTF8 to UTF16 
std::string input = ... 
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0); 
std::wstring output(utf16len); 
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size()); 
//UTF16 to UTF8 
std::wstring input = ... 
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0, NULL, NULL); 
std::string output(utf8len); 
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size(), NULL, NULL); 
+0

हंटर: ध्यान दें कि विंडोज आइकनवी के साथ नहीं आता है, लेकिन इसे पाने के तरीके हैं। @Dreamlax: क्या आपको दिमाग है यदि हम आपके उत्तर को विंडोज विकल्प के रूप में अपना नाम डालते हैं और मेरा हटा देते हैं? पुस्तकालय का उपयोग करने की अवधारणा सही है, और आपका इसके बारे में स्पष्ट है। –

+0

@MooingDuck: हाँ बिल्कुल, एक अच्छा विचार की तरह लगता है। मेरा मेरा या तुम्हारा में मेरा रखो, जो भी हो। – dreamlax

+1

@MooingDuck: हमम ... सही नहीं था जब मैंने कहा कि ... – dreamlax

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