Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 siguiente tabla se enumeran algunos otros typedefs relacionados 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* |
Important
Los tipos WCHAR y wchar_t se describen normalmente como representando caracteres Unicode. Sin embargo, es más preciso decir que representan unidades de código UTF-16 Unicode. El estándar Unicode® usa el carácter de término para hacer referencia a los elementos de texto abstractos codificados por el estándar y la unidad de código para hacer referencia a los valores con tipo que se usan para representarlos en un formulario de codificación Unicode. En la codificación UTF-16, los caracteres Unicode se codifican como una o dos unidades de código de 16 bits. En Windows, WCHAR y wchar_t siempre son una sola unidad de código de 16 bits. Aunque muchos caracteres Unicode se representan mediante un solo valor WCHAR o wchar_t, muchos otros caracteres Unicode requieren una secuencia de dos valores de este tipo. Estos pares de unidades de código UTF-16 a menudo se conocen como pares suplentes y cada uno de los valores de 16 bits de un par suplente se conoce como unidad de código suplente. Al trabajar con cadenas Unicode, es importante no tratar nunca una sola unidad de código sustituta como si fuera un carácter completo. Consulte Suplentes y caracteres complementarios para obtener más información.
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 corresponde a la versión Unicode cuando se define el símbolo del preprocesador UNICODE o a la versión ANSI en caso contrario.
#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 usar 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"));
da como resultado 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.