2008-08-26 13 views

Antwort

96

Vielen Dank für den Link zum MSDN-Artikel. Genau das habe ich gesucht.

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

(Diese Frage wurde zufällig gefunden; es ist lange her, dass ich C++ gemacht habe.) Also hat die Standardbibliothek keine std :: string -> std :: wstring-Umwandlung? Das scheint komisch zu sein; Gibt es einen guten Grund? – Domenic

+4

Wenn Sie std :: vector verwenden, um Speicher für buf zu erstellen, wird der temporäre Puffer freigegeben, wenn irgendetwas eine Ausnahme auslöst. –

+51

Grund # 233, warum C++ die Hölle mich ärgert..10 Zeilen Code für eine einfache String-Konvertierung =/ –

2

Statt einem std :: string verwenden, Sie könnten ein Std :: Wstring verwenden.

EDIT: Sorry das ist nicht mehr erklärend, aber ich muss laufen.

Verwendung std :: wstring :: c_str()

+6

* F: "Ich muss von X zu Y konvertieren." * - * A: "Suchen Sie nach einem Job, in dem sie A anstelle von X verwenden." * Dies ist nutzlos. – IInspectable

7

Wenn Sie in einer ATL/MFC-Umgebung sind, können Sie die ATL-Konvertierung Makro verwenden:

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

. . . 

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

Sie können dann unicodeStr als verwenden LPCWSTR. Der Speicher für die Unicode-Zeichenfolge wird auf dem Stapel erstellt und freigegeben, dann wird der Destruktor für UnicodeStr ausgeführt.

88

Die Lösung ist eigentlich viel einfacher als alle anderen Vorschläge:

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

Das Beste von allem, es ist plattformunabhängig. h2h :)

+2

Sorry Benny, aber das funktioniert nicht für mich, Torans eigene Lösung scheint aber gut zu funktionieren (but..bled!). –

+0

funktioniert gut. Vielen Dank. – Durgesh

+24

Dies funktioniert nur, wenn alle Zeichen ein einzelnes Byte sind, d. H. ASCII oder [ISO-8859-1] (http: //en.wikipedia.org/wiki/ISO-8859-1). Alles Multibyte wird kläglich scheitern, einschließlich UTF-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

Sie CString als Zwischen verwenden:

std::string example = "example"; 
CString cStrText = example.c_str(); 
LPTSTR exampleText = cStrText.GetBuffer(0); 
Verwandte Themen