2009-05-13 24 views
40

Come convertire da CString a const char* nella mia applicazione Unicode MFC?Converti CString in const char *

+3

Il fatto che siete costruire un programma unicode è CHIAVE per questo problema - PER FAVORE aggiungi questa informazione alla domanda. (o qualcuno con rappresentante lo fa?) – Aardvark

risposta

60

Per convertire un CString TCHAR in ASCII, utilizzare il CT2A macro - Ciò consentirà anche di convertire la stringa in UTF8 (o qualsiasi altra pagina di codice di Windows):

// 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); 

C'è anche una macro da convertire da ASCII -> Unicode (CA2T) e puoi usarli nelle app ATL/WTL finché hai VS2003 o versioni successive.

Vedere MSDN per ulteriori informazioni.

+0

Ho già ottenuto la risposta alla domanda un po 'prima e hai ragione, ho usato la macro CT2A Grazie. – Attilah

+0

Puoi anche fare TRACE (_T (" ASCII:% S \ n "), CT2A (str) .m_psz); – ajs410

+0

' CA2T' fa ** non ** converte in Unicode. Converte in un 'TCHAR' che può o non può rappresentare caratteri Unicode.' CA2 [ C] W' è la macro che converte in Unicode. – IInspectable

12

Nota: questa risposta è anteriore al requisito Unicode; guarda i commenti

appena lanciato è:

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

Funziona perché CString ha un operatore di cast per fare esattamente questo.

Utilizzo di TCHAR rende indipendente il codice Unicode; se non sei preoccupato per Unicode puoi semplicemente usare char invece di TCHAR.

+0

quando provo il tuo metodo, ottengo questo errore: "Errore errore C2664: 'CppSQLite3DB :: execDML': impossibile convertire il parametro 1 da 'const TCHAR *' a 'const char * '". le mie impostazioni projetc utilizzano Unicode ma la funzione CppSQLite3DB :: execDML richiede un parametro const char *. – Attilah

+0

Come dice Mark, è necessario convertire da un CString Unicode a un CString ANSI: CStringA charstr (unicodestr); È quindi possibile eseguire il cast di CStringA in un const char * – RichieHindle

3

C'è un cast esplicito sulla CString LPCTSTR, in modo da poter fare (a condizione unicode non è specificato):

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

Ho ricevuto questo messaggio di errore: errore C2440: 'tipo cast': impossibile convertire da 'CString' a 'LPCSTR' –

+0

Questa risposta è corretta per ANS. CString. In caso di CString Unicode, vedere la risposta accettata. – amolbk

18

Se il CString è Unicode, è necessario fare una conversione a multi caratteri byte. Fortunatamente esiste una versione di CString che lo farà automaticamente.

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

quando uso questo, ottengo questo errore: "Errore errore C2440: 'inizializzazione': impossibile convertire da 'CString' a 'ATL :: CStringT '" " – Attilah

+0

@Attilah: Grazie per la Ho capito che la sintassi era errata Risolto: –

1

Ho avuto un problema simile. Ho avuto un buffer char* con il nome .so in esso.
Non è stato possibile convertire la variabile char* in LPCTSTR. Ecco come ho ottenuto intorno ad esso ...

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

ho recommendo a utilizzare TTOC da ConvUnicode.h

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

Si tratta di una macro per fare conversioni per Unicode