Win32 API
Ansi- och bredkaraktärsfunktioner
Sök…
Introduktion
Windows API-dokumentationen för funktioner som tar en eller flera strängar som argument kommer vanligtvis att se ut så här:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Datatypen för de två strängparametrarna består av flera delar:
- LP = Lång pekare
- C = konst
- T = TCHAR
- STR = sträng
Vad betyder TCHAR
? Detta beror på vilken plattform som valts för sammanställning av program.
CopyFile
sig är bara ett makro, definierat något liknande:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
Så det finns faktiskt två CopyFile
funktioner och beroende på kompilatorflaggor kommer CopyFile
att lösa till det ena eller det andra.
I det här TCHAR
definieras TCHAR
som:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Så igen, beroende på kompilera flaggorna, är TCHAR ett "smalt" eller "brett" (2 byte) tecken.
Så när UNICODE är definierat definieras CopyFile
till CopyFileW
, som kommer att använda 2-byte-teckenuppsättningar som deras parameter, som förväntas vara UTF-16-kodad.
Om Unicode inte är definierad, CopyFile
definieras att vara CopyFileA
som använder enkelbyteteckenuppsättningar som förväntas som skall kodas i standard ANSI kodningen av den aktuella användaren.
Det finns två liknande makron: UNICODE
gör att Windows API: er förväntar sig breda strängar och _UNICODE
(med en ledande understruk) som möjliggör liknande funktioner i C-runtime-biblioteket.
Dessa definierar tillåter oss att skriva kod som sammanställs i både ANSI och i Unicode-läge.
Det är viktigt att veta att ANSI-kodningen kan vara en enkel-byte-kodning (dvs latin-1), en multi-byte-kodning (dvs shift jis), även om utf-8 tyvärr inte stöds väl.
Detta innebär att varken ANSI eller variant av dessa funktioner kan antas fungera med fast breddskodning.