Trabajo con cadenas
Windows admite de forma nativa cadenas Unicode para elementos de interfaz de usuario, nombres de archivo, etc. Unicode es la codificación de caracteres preferida, ya que admite todos los juegos de caracteres y los idiomas. Windows representa caracteres Unicode mediante codificación UTF-16, en la que cada carácter se codifica como uno o dos valores de 16 bits. Los caracteres UTF-16 se denominan caracteres anchos , para distinguirlos de caracteres ANSI de 8 bits. 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 definición de tipo siguiente.
typedef wchar_t WCHAR;
Verá ambas versiones en el código de ejemplo de MSDN. 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";
Estas son otras definiciones de tipo relacionadas con cadenas que verá:
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 Unicode y ANSI
Cuando Microsoft introdujo compatibilidad con Unicode para Windows, facilitaba la transición proporcionando dos conjuntos paralelos de API, una para cadenas ANSI y la otra para cadenas Unicode. Por ejemplo, hay dos funciones para establecer 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 la versión ANSI de lo contrario.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
En MSDN, la función se documenta bajo 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 la aplicación. Las versiones ANSI también son menos eficaces, ya que el sistema operativo debe convertir las cadenas ANSI en Unicode en tiempo de ejecución. Dependiendo de su preferencia, puede llamar explícitamente a las funciones Unicode, como SetWindowTextW, o usar las macros. El código de ejemplo de MSDN normalmente llama a las macros, pero los dos formularios son exactamente equivalentes. La mayoría de las API más recientes de Windows tienen solo una versión Unicode, sin ninguna versión ANSI correspondiente.
TCHAR
De vuelta cuando las aplicaciones necesitaban admitir Tanto Windows NT como Windows 95, Windows 98 y Windows Me, resultaba útil compilar el mismo código para cadenas ANSI o Unicode, en función de la plataforma de destino. Para ello, Windows SDK proporciona 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 una de las siguientes opciones:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
Las macros TEXT y TCHAR son menos útiles hoy en día, ya que todas las aplicaciones deben usar Unicode. Sin embargo, es posible que los vea en código anterior y en algunos de los ejemplos de código de MSDN.
Los encabezados de las bibliotecas en tiempo de ejecución de Microsoft C 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
Tenga cuidado: algunos encabezados usan el símbolo UNICODE
del preprocesador , 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.
Siguientes
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de