2008-10-29 6 views
48

konvertieren Gibt es eine Methode? Mein Computer ist AMD64.Ich möchte std :: string in eine const wchar_t *

::std::string str; 
BOOL loadU(const wchar_t* lpszPathName, int flag = 0); 

Als ich verwendet:

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?

Antwort

35

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 verbreitern müssen . Es gibt verschiedene Möglichkeiten hier; Eine besteht darin, die in Windows eingebaute MultiByteToWideChar Routine zu verwenden. Das gibt Ihnen eine LPWSTR, die wchar_t* entspricht.

+0

Oder einfach eine 'string var = L 'Text"; ' – cybermonkey

+2

@ ʎǝʞuoɯɹǝqʎɔ: Sie meinen' wstring var = L "text"; ' –

75

Zuerst wandelt es in std :: wstring:

std::wstring widestr = std::wstring(str.begin(), str.end()); 

dann die C-Saite erhalten:

const wchar_t* widecstr = widestr.c_str(); 

Dies funktioniert nur für ASCII-Strings, aber es wird nicht funktionieren, wenn die zugrunde liegende Zeichenfolge UTF-8 codiert. Die Verwendung einer Konvertierungsroutine wie MultiByteToWideChar() stellt sicher, dass dieses Szenario ordnungsgemäß behandelt wird.

+3

Dies sollte für ASCII-Strings funktionieren, aber es funktioniert nicht, wenn der zugrunde liegende Die Zeichenfolge ist UTF-8-codiert. Die Verwendung einer Konvertierungsroutine wie MultiByteToWideChar() stellt sicher, dass dieses Szenario ordnungsgemäß behandelt wird. –

+0

Sie sollten MultiByteToWideChar mit der richtigen Codepage verwenden.Um genau zu sein, werden zwei Aufrufe benötigt: die erste, um die gewünschte Länge des Zielzeichens wchar_t zu erhalten, und die zweite, um die Zeichenkette in die Zeichenkette wchar_t zu konvertieren. –

+0

Es funktioniert nur, wenn wchar_t ist Unicode und char ist Latin-1 oder ASSCII. Die ersten 256 Zeichen von Unicode stimmen genau mit Latin-1 überein; die ersten 128 Zeichen von Latin-1 stimmen genau mit ASCII überein. – MSalters

8

Sie können die ATL-Textkonvertierungs-Makros verwenden, um eine schmale (char) Zeichenfolge in eine breite (wchar_t) zu 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 enthält UTF-8-Zeichen können Sie verwenden: Um zum Beispiel eine std :: string konvertieren

CA2W pszWide(str.c_str(), CP_UTF8); 

Sehr nützlich, aber nur Windows.

+0

Sie wollen wahrscheinlich CA2CW. Sie können auch eine grundlegende Erklärung für die Namenskonvention des Makros hinzufügen (zB: Const Ascii -> Const Wchar). – Nick

+0

Es gibt keine CA2CW-Konvertierungsfunktion. Es gibt eine CA2CT-Version, aber diese ruft einfach CA2W auf. Eine vollständige Liste finden Sie unter . – Rob

+0

Unglaublich nützlich. In meinem Fall funktionierte nur '#include ', während '#include ' nicht funktionierte. Keine Ahnung warum. – ceztko

4

Wenn Sie unter Linux/Unix sind, schauen Sie sich mbstowcs() und wcstombs() an, die in GNU C (von ISO C 90) definiert sind.

  • mbs stehen für "Multi Bytes String" und ist im Grunde die übliche Null abgeschlossen C-String.

  • Wcs stehen für Wide Char String und ist ein Array von wchar_t.

  • Weitere Hintergrundinformationen zu Wide Chars finden Sie in der glibc Dokumentation here.

    +1

    Ich glaube, diese sind in C-Standard; So oder so, sie sind auch in Windows: https://msdn.microsoft.com/en-us/library/k1f9b8cy.aspx –

    Verwandte Themen