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 funcionesstr
. 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 objetoCArchive
no funcionará (str
es una claseCString
):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
. Utilicewmain
para que la aplicación esté preparada para Unicode.