Buscar..


Introducción

La documentación de la API de Windows para funciones que toman una o más cadenas como argumento generalmente se verá así:

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

El tipo de datos para los dos parámetros de cadena se compone de varias partes:

  • LP = puntero largo
  • C = const
  • T = TCHAR
  • STR = cadena

Ahora, ¿qué significa TCHAR ? Esto depende de la plataforma elegida para la compilación del programa.

CopyFile propio CopyFile es solo una macro, definió algo como esto:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

Entonces, en realidad hay dos funciones CopyFile y, según las banderas del compilador, la macro CopyFile se resolverá en una u otra.

Allí token de núcleo, TCHAR se define como:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

Así que de nuevo, dependiendo de las banderas de compilación, TCHAR es un carácter "estrecho" o "ancho" (2 bytes).

Por lo tanto, cuando se define UNICODE, CopyFile se define como CopyFileW , que usará matrices de caracteres de 2 bytes como su parámetro, que se espera que esté codificado en UTF-16.

Si no se define UNICODE, CopyFile se define como CopyFileA que utiliza matrices de caracteres de un solo byte que se espera que estén codificadas en la codificación ANSI predeterminada del usuario actual.

Hay dos macros similares: UNICODE hace que las API de Windows esperen cadenas anchas y _UNICODE (con un guión bajo) que habilita funciones similares en la biblioteca de tiempo de ejecución de C.

Estas definiciones nos permiten escribir código que se compila tanto en ANSI como en modo Unicode.

Es importante saber que la codificación ANSI puede ser una codificación de un solo byte (es decir, latin-1) y una codificación de múltiples bytes (es decir, shift jis), aunque desafortunadamente no se admite el utf-8.

Esto significa que no se puede asumir que ni la variante ANSI ni la variante de caracteres anchos de estas funciones funcionen con codificaciones de ancho fijo.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow