Compartir a través de


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 UNICODEdel 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

¿Qué es una ventana?