2009-05-13 20 views
40

¿Cómo convierto de CString a const char* en mi aplicación Unicode MFC?Convertir CString en const char *

+3

El hecho de que usted está construir un programa Unicode es CLAVE para este problema - POR FAVOR agregue esta información a la pregunta. (o alguien con rep hacerlo?) – Aardvark

Respuesta

60

Para convertir un CString TCHAR a ASCII, utilice el CT2A macro - esto también le permitirá convertir la cadena en UTF-8 (o cualquier otra página de códigos de 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); 

También hay una macro para convertir de ASCII -> Unicode (CA2T) y puede utilizarlos en aplicaciones ATL/WTL siempre que tenga VS2003 o superior.

Consulte MSDN para obtener más información.

+0

ya recibí la respuesta un poco antes y tienes razón, utilicé la macro CT2A. Gracias. – Attilah

+0

También podrías hacer TRACE (_T (" ASCII:% S \ n "), CT2A (str) .m_psz); – ajs410

+0

' CA2T' no ** convierte ** a Unicode. Se convierte en un 'TCHAR' que puede o no representar caracteres Unicode.' CA2 [ C] W' es la macro que se convierte en Unicode. – IInspectable

12

Nota: Esta respuesta es anterior al requisito de Unicode; ver los comentarios

Justo lo echarás:

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

Funciona porque CString tiene un operador de conversión para hacer exactamente esto.

El uso de TCHAR hace que su código sea independiente de Unicode; Si no está preocupado por Unicode, simplemente puede usar char en lugar de TCHAR.

+0

cuando pruebo su método, me sale este error: "Error error C2664: 'CppSQLite3DB :: execDML': no ​​se puede convertir el parámetro 1 de 'const TCHAR *' a 'const char * '". mi configuración de proyecto usa Unicode pero la función CppSQLite3DB :: execDML requiere un parámetro const char *. – Attilah

+0

Como dice Mark, debe convertir de un CSC de Unicode a un ANSI CStringA: CStringA charstr (unicodestr); A continuación, puede convertir el CStringA en un const char * – RichieHindle

3

Hay una conversión explícita de CString a LPCTSTR, por lo que puede hacer (siempre Unicode no se especifica):

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

Recibí este mensaje de error: error C2440: 'tipo de conversión': no ​​se puede convertir de 'CString' a 'LPCSTR' –

+0

Esta respuesta es correcta para ANSI CString. En el caso de Unicode CString, vea la respuesta aceptada. – amolbk

18

Si su CString es Unicode, tendrá que hacer una conversión a multi- caracteres byte. Afortunadamente hay una versión de CString que hará esto automáticamente.

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

cuando uso esto, me sale este error: "Error error C2440: 'inicializando': no ​​se puede convertir de 'CString' a 'ATL :: CStringT '" " – Attilah

+0

@Attilah: Gracias por atrapando eso, tuve la sintaxis incorrecta. Reparado –

1

Tuve un problema similar. Tenía un buffer char* con el nombre .so en él.
No pude convertir la variable char* en LPCTSTR. Así es como llegué a su alrededor ...

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

I recommendo que utiliza ttoc de ConvUnicode.h

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

Es una macro para hacer conversiones por Unicode