Trabajo con cadenas
En este tema se explica cómo Windows admite cadenas Unicode para elementos de IU, nombres de archivo, etc. (Unicode es la codificación de caracteres preferida porque admite todos los conjuntos de caracteres e idiomas).
Windows representa caracteres Unicode mediante la codificación UTF-16, en la que cada carácter se codifica como uno o dos valores de 16 bits. Para distinguirlos de caracteres ANSI de 8 bits, los caracteres UTF-16 se denominan caracteres anchos. El compilador de Visual C++ admite el tipo de datos integrado wchar_t para caracteres anchos. El archivo de encabezado WinNT.h también define la siguiente typedef.
typedef wchar_t WCHAR;
Para declarar un literal de caracteres anchos o un literal de cadena de caracteres anchos, coloque L delante del literal.
wchar_t a = L'a';
wchar_t *str = L"hello";
En la tabla siguiente se dan otras definiciones de tipo (typedefs) relacionadas con cadenas:
Definición de tipo | Definición |
---|---|
CHAR | char |
PSTR o LPSTR | char* |
PCSTR o LPCSTR | const char* |
PWSTR o LPWSTR | wchar_t* |
PCWSTR o LPCWSTR | const wchar_t* |
Funciones de Unicode y ANSI
Cuando Microsoft incorporó la funcionalidad de Unicode en Windows, facilitó la transición incluyendo dos grupos paralelos de API, uno para cadenas ANSI y el otro para cadenas Unicode. Por ejemplo, hay dos funciones para crear el texto de la barra de título de una ventana:
- SetWindowTextA toma una cadena ANSI.
- SetWindowTextW toma una cadena Unicode.
Internamente, la versión ANSI traduce la cadena a Unicode. Los encabezados de Windows también definen una macro que se resuelve en la versión Unicode cuando se define el símbolo UNICODE
del preprocesador o, por el contrario, la versión ANSI.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
La función viene documentada con el nombre SetWindowText, aunque es realmente el nombre de la macro, no el nombre de la función real.
Las nuevas aplicaciones siempre deben llamar a las versiones Unicode. Muchos idiomas del mundo requieren Unicode. Si usa cadenas ANSI, será imposible localizar su aplicación. Además, las versiones ANSI son menos eficaces, ya que el sistema operativo debe convertir las cadenas ANSI en Unicode en tiempo de ejecución. Según sus preferencias, puede llamar explícitamente a las funciones Unicode, como SetWindowTextW, o usar las macros. Las API de Windows más recientes suelen tener solo una versión Unicode.
TCHARs
En algunos casos, puede resultar útil compilar el mismo código para cadenas ANSI o Unicode, en función de la plataforma de destino. Para ello, el SDK de Windows ofrece macros que asignan cadenas a Unicode o ANSI, en función de la plataforma.
Macro | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t |
char |
TEXT("x") o _T("x") |
L"x" |
"x" |
Por ejemplo, el código siguiente:
SetWindowText(TEXT("My Application"));
se resuelve en uno de los siguientes:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
Las macros TEXT y TCHAR son menos útiles actualmente, ya que todas las aplicaciones deben usar Unicode.
Los encabezados de las bibliotecas en tiempo de ejecución de C de Microsoft definen un conjunto similar de macros. Por ejemplo, _tcslen se resuelve en strlen si _UNICODE
no está definido; de lo contrario, se resuelve en wcslen, que es la versión de caracteres anchos de strlen.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
Atención: Algunos encabezados usan el símbolo UNICODE
del preprocesador y otros usan _UNICODE
con un prefijo de subrayado. Defina siempre ambos símbolos. Visual C++ los establece de forma predeterminada al crear un nuevo proyecto.