2009-05-13 3 views
40

Wie konvertiere ich von CString zu in meiner Unicode MFC-Anwendung?Convert CString zu const char *

+3

Die Tatsache, dass Sie ein Unicode-Programm zu bauen ist der Schlüssel zu diesem Problem - bitte fügen Sie diese Informationen zu der Frage hinzu. (oder jemand mit Rep tun es?) – Aardvark

Antwort

60

Um einen TCHAR CString in ASCII zu konvertieren, verwenden Sie die CT2A Makro - dies erlaubt es Ihnen auch um die Zeichenfolge zu UTF8 (oder jede andere Windows-Codepage) zu konvertieren:

// Convert using the local code page 
CString str(_T("Hello, world!")); 
CT2A ascii(str); 
TRACE(_T("ASCII: %S\n"), ascii.m_psz); 

// Convert to UTF8 
CString str(_T("Some Unicode goodness")); 
CT2A ascii(str, CP_UTF8); 
TRACE(_T("UTF8: %S\n"), ascii.m_psz); 

// Convert to Thai code page 
CString str(_T("Some Thai text")); 
CT2A ascii(str, 874); 
TRACE(_T("Thai: %S\n"), ascii.m_psz); 

Es ist auch ein Makro zum Konvertieren von ASCII -> Unicode (CA2T) und Sie können diese in ATL/WTL-Anwendungen verwenden, solange Sie VS2003 oder höher haben.

Weitere Informationen finden Sie unter MSDN.

+0

Ich habe bereits die Antwort auf die Frage ein wenig früher und du hast recht, ich habe das CT2A Makro verwendet. Danke. – Attilah

+0

Sie könnten auch TRACE (_T (" ASCII:% S \ n "), CT2A (str) .m_psz); – ajs410

+0

' CA2T' konvertiert ** nicht in Unicode. Es wird in ein 'TCHAR' konvertiert, das Unicode-Zeichen darstellen kann oder nicht.' CA2 [ C] W' ist das Makro, das in Unicode konvertiert – IInspectable

12

Hinweis: Diese Antwort ist älter als die Unicode-Anforderung. Siehe die Kommentare.

Gerade sie werfen:

CString s; 
const TCHAR* x = (LPCTSTR) s; 

Es funktioniert, weil CString eine Cast-Operator hat genau dies zu tun.

Mit TCHAR wird Ihr Code Unicode-unabhängig; Wenn Sie nicht besorgt über Unicode sind, können Sie einfach char anstelle von TCHAR verwenden.

+0

Wenn ich Ihre Methode versuchen, erhalte ich diesen Fehler: "Fehler Fehler C2664: 'CppSQLite3DB :: execDML': kann Parameter 1 von 'Const TCHAR *' zu 'const char * '". Meine Projekteinstellungen verwenden Unicode, aber die Funktion CppSQLite3DB :: execDML benötigt einen const char * -Parameter. – Attilah

+0

Wie Mark sagt, müssen Sie von einem Unicode CString zu einem ANSI CStringA konvertieren: CStringA charstr (Unicodestr); Sie können dann CStringA zu einem Const char * – RichieHindle

3

Es gibt eine explizite Umwandlung auf CString LPCTSTR, so können Sie tun (vorausgesetzt Unicode ist nicht angegeben):

CString str; 
// .... 
const char* cstr = (LPCTSTR)str; 
+0

ich habe diese Fehlermeldung: Fehler C2440: 'Typ Umwandlung': Konvertierung von 'CString' zu 'LPCSTR' –

+0

Diese Antwort ist korrekt für ANSI CString. Im Falle von Unicode CString, sehen Sie die akzeptierte Antwort. – amolbk

18

Wenn Ihr CString Unicode ist, müssen Sie eine Umwandlung tun, um multi- Byte Zeichen. Glücklicherweise gibt es eine Version von CString, die das automatisch macht.

CString unicodestr = _T("Testing"); 
CStringA charstr(unicodestr); 
DoMyStuff((const char *) charstr); 
+0

Wenn ich dies verwende, bekomme ich diesen Fehler: "Fehler Fehler C2440: 'Initialisierung': kann nicht von 'CString' zu 'ATL :: CStringT '" " – Attilah

+0

@Attilah: Danke für das fing ich an, hatte ich die Syntax falsch. Behoben. –

1

Ich hatte ein ähnliches Problem. Ich hatte einen char* Puffer mit dem Namen .so drin.
Ich konnte die Variable char* nicht in LPCTSTR konvertieren. Hier ist, wie ich um ihn bekam ...

char *fNam; 
... 
LPCSTR nam = fNam; 
dll = LoadLibraryA(nam); 
0

I recommendo Sie TTOC von ConvUnicode.h verwenden

const CString word= "hello"; 
const char* myFile = TtoC(path.GetString()); 

Es ist ein Makro-Conversions zu tun pro Unicode