16

मैं प्लेटफ़ॉर्म :: स्ट्रिंग की सामग्री को उन कार्यों द्वारा उपयोग करने के लिए कैसे परिवर्तित करूं जो char * आधारित स्ट्रिंग की अपेक्षा करते हैं? मुझे लगता है कि WinRT इसके लिए सहायक कार्य प्रदान करता है लेकिन मैं उन्हें नहीं ढूंढ सकता।प्लेटफ़ॉर्म :: स्ट्रिंग टू char * को कैसे परिवर्तित करें?

धन्यवाद!

+0

आप यूटीएफ -16LE से रूपांतरण के लिए नहीं पूछ सकते हैं, जब तक कि आप अपना लक्षित चरित्र एन्कोडिंग निर्दिष्ट न करें। यह क्या है? – IInspectable

उत्तर

13

Platform::String::Data() स्ट्रिंग की सामग्री को इंगित करने के लिए wchar_t const* लौटाएगा (std::wstring::c_str() के समान)। Platform::String एक अपरिवर्तनीय स्ट्रिंग का प्रतिनिधित्व करता है, इसलिए wchar_t* प्राप्त करने के लिए कोई एक्सेसर नहीं है। आपको इसकी सामग्री कॉपी करना होगा, उदा। परिवर्तन करने के लिए std::wstring में।

कोई प्रत्यक्ष तरीका है क्योंकि Platform::String विस्तृत वर्णों का उपयोग करता एक char* या एक char const* प्राप्त करने के लिए नहीं है (सभी मेट्रो शैली क्षुधा यूनिकोड क्षुधा हैं)। आप WideCharToMultiByte का उपयोग कर मल्टीबाइट में कनवर्ट कर सकते हैं।

+0

क्या कोई मेट्रो-विशिष्ट "अप्रत्यक्ष" विधियां char * में परिवर्तित करने के तरीके हैं? – djcouchycouch

+0

'वाइडछारटो मल्टीबीटाइट' मेट्रो स्टाइल ऐप से कॉल करने योग्य है। –

+0

मैं देखता हूं। ठीक है धन्यवाद! – djcouchycouch

1

String::Dataconst char16* लौटने की विधि है, जो कच्ची यूनिकोड स्ट्रिंग है।

यूनिकोड से एएससीआई या जो भी हो, रूपांतरण char16* से char*, एक अलग मामला है। आपको शायद इसकी आवश्यकता नहीं है क्योंकि अधिकांश विधियों में इन दिनों wchar संस्करण हैं।

+2

हां, क्योंकि मैं एक जादू दुनिया में नहीं रहता हूं। मैं जिस कोड के साथ काम कर रहा हूं वह विरासत कोड है जो 8 बिट वर्ण तारों की अपेक्षा करता है। :) – djcouchycouch

13

यहां बफर की लंबाई के बारे में चिंता करने के लिए कोड w/o में ऐसा करने का एक बहुत ही आसान तरीका है। केवल इस समाधान का उपयोग करता है, तो आप कुछ आप ASCII साथ काम कर रहे हैं:

Platform::String^ fooRT = "aoeu"; 
std::wstring fooW(fooRT->Begin()); 
std::string fooA(fooW.begin(), fooW.end()); 
const char* charStr = fooA.c_str(); 

ध्यान रखें कि इस उदाहरण में, char* ढेर पर है और दूर जाना होगा एक बार यह गुंजाइश

+2

हर समस्या के लिए, एक समाधान है, यह सरल, सुरुचिपूर्ण है। और गलत इस तरह। एएससीआईआई अक्षरों की सीमा के बाहर कोई भी चरित्र निष्पादन धागे वर्तमान स्थिति के आधार पर, एक यादृच्छिक प्रतिनिधित्व के लिए कुचला जाएगा। ** इस समाधान का उपयोग न करें। ** (जो आसान है, क्योंकि यह संकलित भी नहीं करता है।) – IInspectable

+0

कंपाइलर त्रुटि फिक्स्ड। पुनश्च:। फिर भी परिवर्तित करता है, तो 100% यकीन है कि आप केवल stdext 'चार * कच्चे = std :: wstring_convert >() to_bytes का उपयोग किए बिना – bas

1

एक समाधान का उपयोग कर wcstombs:

Platform::String^ platform_string = p_e->Uri->AbsoluteUri; 
const wchar_t* wide_chars = platform_string->Data(); 
char chars[512]; 
wcstombs(chars, wide_chars, 512); 
5

आप एक चार के लिए एक विस्तृत चरित्र डाली नहीं करना चाहिए, आप चरित्र प्रति एक से अधिक बाइट, जैसे उपयोग करके सभी भाषाओं वध करना होगा चीनी। यहां सही विधि है।

#include <cvt/wstring> 
#include <codecvt> 

Platform::String^ fooRT = "foo"; 
stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert; 
std::string stringUtf8 = convert.to_bytes(fooRT->Data()); 
const char* rawCstring = stringUtf8.c_str(); 
+0

या एक रेखीय ASCII वर्ण से निपटने के लिए है कि का एक अच्छा तरीका (fooRT -> डेटा())। C_str(); ' – Quest

+2

लेकिन @ क्वेस्ट की विधि का उपयोग करते हुए, 'कच्चे' चर का उपयोग शब्दकोष स्मृति के रूप में किया जाएगा (अभिव्यक्ति के मूल्यांकन के बाद अस्थायी वस्तु समाप्त हो जाती है) यदि शाब्दिक रूप से उपयोग किया जाता है। बेहतर उपयोग 'std :: string utf8 = std :: wstring_convert >()। To_bytes (fooRT-> डेटा())' जब तक कि आप सुनिश्चित न हों कि आप क्या कर रहे हैं। –