Win32 API
Funciones de caracteres ansi- y anchos.
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.