Compartir por


Resumen de la programación con Unicode

Para disfrutar de las ventajas de la compatibilidad en tiempo de ejecución de C y MFC con Unicode, es necesario:

  • Defina _UNICODE.

    Definir el símbolo _UNICODE antes de compilar el programa.

  • Especificar el punto de entrada.

    En la página Avanzado de la carpeta Linker en el cuadro de diálogo Páginas de propiedades del proyecto, establezca el símbolo del punto de entradaen wWinMainCRTStartup.

  • Utilizar tipos y funciones portables en tiempo de ejecución.

    Para el control de cadenas de Unicode se han de utilizar las funciones en tiempo de ejecución de C adecuadas. Se puede utilizar la familia de funciones wcs, pero puede ser preferible utilizar las macros _TCHAR totalmente portables (habilitadas internacionalmente). Todas estas macros tienen el prefijo _tcs; sustituyen, de una en una, a la familia de funciones str. Estas funciones se describen detalladamente en la sección Internacionalización de la Referencia de la biblioteca en tiempo de ejecución. Para más información, consulte Asignaciones de texto genérico en tchar.h.

    Utilice _TCHAR y los tipos de datos portables relacionados que se describen en Compatibilidad con Unicode.

  • Controlar las cadenas literales de forma adecuada.

    El compilador de Visual C++ interpreta una cadena literal codificada como:

    L"this is a literal string"
    

    para indicar una cadena de caracteres Unicode. Se puede utilizar el mismo prefijo para los literales de cadena. Utilice la macro _T para programar cadenas literales de forma genérica, para que se compilen como cadenas de Unicode bajo Unicode o como cadenas ANSI (incluyendo MBCS) sin Unicode. Por ejemplo, en lugar de:

    pWnd->SetWindowText( "Hello" );
    

    utilice:

    pWnd->SetWindowText( _T("Hello") );
    

    Con el símbolo _UNICODE definido, _T convierte la cadena literal en la forma con L inicial; de lo contrario, _T convierte la cadena sin la L inicial.

    Sugerencia

    La macro _T es idéntica a la macro _TEXT.

  • Adoptar precauciones al pasar longitudes de cadenas a funciones.

    Algunas funciones requieren el número de caracteres de una cadena; otras requieren el número de bytes. Por ejemplo, si el símbolo _UNICODE está definido, la llamada siguiente a un objeto CArchive no funcionará (str es una clase CString):

    archive.Write( str, str.GetLength( ) );    // invalid
    

    En una aplicación de Unicode, la longitud proporciona el número de caracteres pero no el número correcto de bytes, ya que cada carácter tiene un ancho de 2 bytes. En su lugar, se debe utilizar:

    archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) );    // valid
    

    que especifica el número correcto de bytes que se han de escribir.

    Sin embargo, las funciones miembro de MFC que están orientadas a caracteres, en lugar de estar orientadas a bytes, funcionan sin este código adicional:

    pDC->TextOut( str, str.GetLength( ) );
    

    CDC::TextOut recibe un número de caracteres, no un número de bytes.

  • Use fopen_s, _wfopen_s para abrir archivos Unicode.

En resumen, MFC y la biblioteca en tiempo en ejecución proporcionan la siguiente compatibilidad para la programación con Unicode:

  • Excepto para las funciones miembro de clase de base de datos, todas las funciones MFC están habilitadas para Unicode, incluso CString. CString también proporciona funciones de conversión Unicode/ANSI.

  • La biblioteca en tiempo de ejecución proporciona versiones de Unicode de todas las funciones de control de cadenas. (La biblioteca en tiempo de ejecución también proporciona versiones portables apropiadas tanto para Unicode como para MBCS. Son las macros _tcs).

  • Tchar.h proporciona tipos de datos portables y la macro _T para convertir cadenas literales y caracteres. Para más información, consulte Asignaciones de texto genérico en tchar.h.

  • La biblioteca en tiempo de ejecución proporciona una versión con caracteres anchos de main. Utilice wmain para que la aplicación esté preparada para Unicode.

Consulte también

Compatibilidad con Unicode