Win32 API
Ansi- en Wide-character functies
Zoeken…
Invoering
De Windows API-documentatie voor functies die een of meer tekenreeksen als argument gebruiken, ziet er meestal als volgt uit:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Het gegevenstype voor de twee stringparameters bestaat uit verschillende delen:
- LP = Lange wijzer
- C = const
- T = TCHAR
- STR = string
Wat betekent TCHAR
? Dit is afhankelijk van het gekozen platform voor de compilatie van het programma.
CopyFile
zelf is slechts een macro, zoiets gedefinieerd:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
Er zijn dus eigenlijk twee CopyFile
functies en afhankelijk van de compilervlaggen zal de CopyFile
macro worden CopyFile
in een van beide.
Daar TCHAR
wordt TCHAR
gedefinieerd als:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Dus nogmaals, afhankelijk van de compileervlaggen, is TCHAR een "smal" of een "breed" (2 bytes) karakter.
Dus wanneer UNICODE wordt gedefinieerd, wordt CopyFile
gedefinieerd als CopyFileW
, dat 2-byte karaktermatrices gebruikt als hun parameter, die naar verwachting UTF-16 gecodeerd zijn.
Als UNICODE niet is gedefinieerd, wordt CopyFile
gedefinieerd als CopyFileA
dat gebruikmaakt van single-byte- CopyFileA
die naar verwachting zullen worden gecodeerd in de standaard ANSI-codering van de huidige gebruiker.
Er zijn twee vergelijkbare macro's: UNICODE
zorgt ervoor dat de Windows API's brede tekenreeksen verwachten en _UNICODE
(met een leidende underscore) die vergelijkbare functies in de C runtime-bibliotheek mogelijk maakt.
Deze definieert ons in staat om code te schrijven die compileert in zowel ANSI als in Unicode-modus.
Het is belangrijk om te weten dat de ANSI-codering een single-byte codering (dwz latin-1) of een multi-byte codering (dwz shift jis) kan zijn, hoewel utf-8 helaas niet goed wordt ondersteund.
Dit betekent dat kan worden aangenomen dat noch de ANSI, noch de Wide-character variant van deze functies werkt met coderingen met vaste breedte.