2008-08-26 5 views
81

मैं एक विधि के लिए देख रहा हूँ, या परिवर्तित std :: स्ट्रिंग के लिए एक कोड का टुकड़ा एक std :: स्ट्रिंग का उपयोग करने काकैसे सी में LPCWSTR को std :: स्ट्रिंग परिवर्तित करने के लिए ++ (यूनिकोड)

+1

हम रिवर्स कैसे करते हैं? – Sohaib

+0

मैं Google से विपरीत करने की कोशिश कर रहा था। क्या आपको कोई विधि नहीं मिली? –

उत्तर

96

एमएसडीएन आलेख के लिंक के लिए धन्यवाद। यही वह है जिसकी तलाश में मैं हूं।

std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

std::wstring stemp = s2ws(myString); 
LPCWSTR result = stemp.c_str(); 
+3

(इस सवाल को यादृच्छिक रूप से ब्राउज़ किया गया; सी ++ के बाद से यह काफी समय हो गया है।) तो मानक लाइब्रेरी में std :: string -> std :: wstring रूपांतरण नहीं है? यह अजीब लगता है; क्या कोई अच्छा कारण है? – Domenic

+4

यदि आप buf के लिए संग्रहण बनाने के लिए std :: vector का उपयोग करते हैं, तो यदि कोई अपवाद फेंक देता है तो आपका अस्थायी बफर मुक्त हो जाएगा। –

+51

कारण # 233 क्यों सी ++ ने मुझे एक साधारण स्ट्रिंग रूपांतरण =/ –

2

LPCWSTR को इसके बजाय, आप एक std :: wstring का उपयोग कर सकते हैं।

संपादित करें: क्षमा करें यह अधिक व्याख्यात्मक नहीं है, लेकिन मुझे दौड़ना है।

उपयोग std :: wstring :: c_str()

+6

* क्यू: "मुझे एक्स से वाई में कनवर्ट करने की आवश्यकता है।" * - * ए: "नौकरी की तलाश करें, जहां वे एक्स के बजाए ए का उपयोग कर रहे हैं।" * यह बेकार है। – IInspectable

7

आप एक ATL/MFC वातावरण में कर रहे हैं, आप ATL रूपांतरण मैक्रो का उपयोग कर सकते हैं:

#include <atlbase.h> 
#include <atlconv.h> 

. . . 

string myStr("My string"); 
CA2W unicodeStr(myStr); 

फिर आप एक के रूप में उपयोग कर सकते हैं unicodeStr LPCWSTR। यूनिकोड स्ट्रिंग के लिए स्मृति स्टैक पर बनाई गई है और फिर यूनिकोड एसआरटी निष्पादन के लिए विनाशक को जारी किया गया है।

88

समाधान वास्तव में अन्य सुझावों में से किसी की तुलना में बहुत आसान है:

std::wstring stemp = std::wstring(s.begin(), s.end()); 
LPCWSTR sw = stemp.c_str(); 

और सबसे अच्छी बात यह मंच स्वतंत्र है। H2H :)

+2

क्षमा करें बेनी लेकिन यह मेरे लिए काम नहीं करता है, तो टोरन का अपना समाधान ठीक काम करता प्रतीत होता है (लेकिन..लेग!)। –

+0

कामकाजी ठीक है। धन्यवाद। – Durgesh

+24

यह केवल तभी काम करता है जब सभी वर्ण एकल बाइट हैं, यानी ASCII या [आईएसओ -885 9 -1] (http: //en.wikipedia।org/wiki/ISO-8859-1)। कुछ भी बहु-बाइट यूटीएफ -8 समेत दुखी हो जाएगा। –

-2
string s = "Hello World"; 
std::wstring stemp = std::wstring(s.begin(), s.end()); 
LPCWSTR title =(LPCWSTR) stemp.c_str(); 

LPCWSTR wname =(LPCWSTR) "Window"; 


HINSTANCE hInst = GetModuleHandle(0); 
WNDCLASS cls = { CS_HREDRAW|CS_VREDRAW, WndProc, 0, 0, hInst, LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION)), 
    LoadCursor(hInst,MAKEINTRESOURCE(IDC_ARROW)), GetSysColorBrush(COLOR_WINDOW),0,wname }; 
RegisterClass(&cls); 
HWND window = CreateWindow(wname,title,WS_OVERLAPPEDWINDOW|WS_VISIBLE,64,64,640,480,0,0,hInst,0); 

MSG Msg; 
while(GetMessage(&Msg,0,0,0)) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
0

आप एक मध्यवर्ती के रूप CString उपयोग कर सकते हैं:

std::string example = "example"; 
CString cStrText = example.c_str(); 
LPTSTR exampleText = cStrText.GetBuffer(0); 
संबंधित मुद्दे