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

  • El hecho de que usted está construyendo un programa con soporte unicode es CLAVE para este problema – por FAVOR agregar esta información a la pregunta. (o alguien con rep hacerlo?)
InformationsquelleAutor Attilah | 2009-05-13

7 Comentarios

  1. 64

    Para convertir un TCHAR CString a ASCII, el uso de la CT2A macro – esto también le permitirá convertir la cadena de caracteres 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 utilizar estos en ATL/WTI aplicaciones como el tiempo que han VS2003 o mayor.

    Ver el MSDN para obtener más información.

    • ya tengo la respuesta a la pregunta un poco más temprano y tienes razón, he utilizado el CT2A macro. Gracias.
    • Usted podría también hacer SEGUIMIENTO(_T(«ASCII: %S\n»), CT2A(str).m_psz);
    • CA2T hace no convertir a Unicode. Se convierte en un TCHAR que pueden o no pueden representar caracteres Unicode. CA2[C]W es la macro que convierte a Unicode.
    • El CT2A ascii(str, CP_UTF8); línea resuelto el problema me informó de que en los comentarios de stackoverflow.com/a/5551013/383779. Gracias.
    • Por cierto, ninguno de los objetos mencionados ascii son, de hecho, codificada en ASCII cadenas. Ellos son estrechas cadenas de caracteres, utilizando ANSI, UTF-8, y la codificación ANSI (en ese orden).
  2. 20

    Si su CString es Unicode, tendrás que hacer una conversión de caracteres multi-byte. Afortunadamente, existe una versión de CString que va a hacer esto de forma automática.

    CString unicodestr = _T("Testing");
    CStringA charstr(unicodestr);
    DoMyStuff((const char *) charstr);
    • cuando yo uso este, me sale este error : «Error 2 error C2440: ‘inicialización’ : no se puede convertir de ‘CString’ a ‘ATL::CStringT<BaseType,StringTraits>'» «
    • Gracias por la captura de eso, yo tenía la sintaxis incorrecta. Fijo.
  3. 15

    Nota: Esta respuesta es anterior a la de Unicode requisito; ver los comentarios.

    Sólo cast:

    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 Unicode-independiente; si no te preocupa acerca de Unicode se puede utilizar simplemente char en lugar de TCHAR.

    • cuando trato de su método, me sale este error : «Error 1 Error C2664: ‘CppSQLite3DB::execDML’ : no se puede convertir el parámetro 1 de ‘const TCHAR ‘ a ‘const char *'». mi projetc la configuración de uso de Unicode, pero la función CppSQLite3DB::execDML requiere un const char parámetro.
    • Como dice Marcos, usted necesita para convertir de una Unicode CString a una ANSI CStringA: CStringA charstr(unicodestr); puede entonces emitir el CStringA a un const char*
  4. 4

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

    CString str;
    //....
    const char* cstr = (LPCTSTR)str;
    • Tengo este mensaje de error : error C2440: ‘conversión de tipo’ : no se puede convertir de ‘CString’ a ‘LPCSTR’
    • Esta respuesta es la correcta para ANSI CString. En caso de Unicode CString, ver la aceptación respuesta.
  5. 1

    He tenido un problema similar. Yo tenía un char* búfer con el .asi que el nombre en ella.

    Yo no se pudo convertir el char* variable LPCTSTR. He aquí cómo llegué a su alrededor…

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

    Me recommendo el uso de TtoC de ConvUnicode.h

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

    Es una macro para realizar conversiones por Unicode

Dejar respuesta

Please enter your comment!
Please enter your name here