2010-12-08 18 views
12

परिवर्तित करें मैं std :: wstring को const * char में C++ में कैसे परिवर्तित कर सकता हूं?cd+ wstring to const * char में C++

+1

कई तरीके हैं। आपके लिए कौन सा सही है, उन तथ्यों पर निर्भर करता है जो आपने प्रदान नहीं किए हैं। आप किस एन्कोडिंग का परिणाम चाहते हैं? आप किस मंच/एन्कोडिंग रूपांतरण lib का उपयोग कर रहे हैं? – sbi

+0

कौन सा ऑपरेटिंग सिस्टम? कम से कम विंडोज़ पर आपको इसे शायद ही कभी करना चाहिए, उदा। अगर आप एक फाइल में यूटीएफ -8 स्ट्रिंग लिखना चाहते हैं। – Philipp

+0

यह है "[पूर्ण न्यूनतम प्रत्येक सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स (कोई बहाना नहीं है!) के बारे में जानना चाहिए (http://www.joelonsoftware.com/articles/Unicode.html)", जिसे पढ़ा जाना चाहिए ! – Jaywalker

उत्तर

11

आप c_str सदस्य समारोह का उपयोग कर एक एक const wchar_t * को std::wstring परिवर्तित कर सकते हैं:

std::wstring s; 
const wchar_t *str = s.c_str(); 

हालांकि, एक const char * में रूपांतरण प्राकृतिक नहीं है: यह std::wcstombs के लिए एक अतिरिक्त कॉल की आवश्यकता है।

+1

क्या आप wcstombs सहित एक पूर्ण उदाहरण दे सकते हैं? मैं आपको जिस तरह से सुझाव देता हूं उसे हल करने की कोशिश कर रहा हूं। –

+0

जब wstring wStr है: 'const wchar_t * str = wStr.c_str(); size_t आकार = wcslen (str) * 2 + 2; चार * स्टार्टपॉइंट = नया चार [आकार]; size_t c_size; wcstombs_s (& c_size, स्टार्टपॉइंट, आकार, str, आकार); ' – arielhad

+0

@arielhad आकार परिभाषा के अंत में +2 क्यों? इसके अलावा, आकार के लिए यह 'फॉर्मूला' मानता है कि चार 8 बिट है, और wchar_t 16 बिट है, है ना? मुझे लगता है कि यह कॉलिंग आकार() लिखना बेहतर होगा क्योंकि यह सभी प्लेटफार्मों के लिए जरूरी नहीं है। – KjMag

5

आप ऐसा ही नहीं कर सकते हैं। std::wstring विस्तृत (यूनिकोड) वर्णों की एक स्ट्रिंग का प्रतिनिधित्व करता है, जबकि इस मामले में char* ASCII वर्णों की एक स्ट्रिंग है। यूनिकोड से ASCII तक कोड पेज रूपांतरण होना चाहिए।

रूपांतरण करने के लिए आप wcstombs, या विंडोज़ WideCharToMultiByte फ़ंक्शन जैसे मानक लाइब्रेरी फ़ंक्शंस का उपयोग कर सकते हैं।

टिप्पणियों से जानकारी को शामिल करने के लिए अपडेट किया गया, यह इंगित करने के लिए धन्यवाद।

+1

मानक पुस्तकालय इसे संभालता है। उदाहरण के लिए, 'wcrtomb',' wcsrtombs' देखें। – nothrow

+1

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

+0

std :: स्ट्रिंग में यूटीएफ- 8 और std :: wstring का विवाह यूटीएफ -16/यूटीएफ -32 से नहीं हुआ है। तो यह एक बहुत भ्रामक जवाब है। – anno

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