Ich möchte std :: string in eine const wchar_t konvertieren *
Frage
Gibt es eine Methode? Mein Computer ist AMD64.
::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
Wenn ich verwende:
loadU(&str);
der VS2005 Compiler sagt:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
Wie kann ich es tun?
Lösung
Wenn Sie eine std :: wstring Objekt haben, können Sie c_str()
auf nennen es eine wchar_t*
zu bekommen:
std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();
Da Sie auf einem schmalen String arbeiten, aber würden Sie es zuerst erweitern müssen. Es gibt verschiedene andere Optionen; ist die Verwendung von Windows' built-in MultiByteToWideChar
Routine. Das gibt Ihnen eine LPWSTR
, die wchar_t*
entspricht.
Andere Tipps
Zuerst wandelt es in std :: wstring:
std::wstring widestr = std::wstring(str.begin(), str.end());
erhalten Sie dann den C-String:
const wchar_t* widecstr = widestr.c_str();
Dies funktioniert nur für ASCII-Strings, aber es wird nicht funktionieren, wenn die zugrunde liegenden String UTF-8 codiert. eine Konvertierungsroutine wie MultiByteToWideChar () verwendet wird sichergestellt, dass dieses Szenario richtig gehandhabt wird.
Sie können die ATL-Text-Konvertierung Makros verwenden, um einen schmalen (char) Zeichenfolge zu einer breiten (wchar_t) umzuwandeln.
: Um zum Beispiel eines std :: string konvertieren#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);
Sie können auch eine Codepage angeben, also, wenn Ihr std :: string UTF-8-Zeichen enthält können Sie:
CA2W pszWide(str.c_str(), CP_UTF8);
Sehr nützlich, aber nur unter Windows.
Wenn Sie auf Linux sind / Unix haben einen Blick auf mbstowcs () und wcstombs () definiert in GNU C (von ISO C 90).
-
mbs stehen für "Multi Bytes String" und ist im Grunde die üblichen Null beendet C-String.
-
wcs stehen für Wide Char String und ist ein Array von wchar_t.
Für weitere Hintergrundinformationen über breite Zeichen haben einen Blick auf glibc Dokumentation hier .