Win32 API
Ansi- und Wide-Character-Funktionen
Suche…
Einführung
Die Windows-API-Dokumentation für Funktionen, die eine oder mehrere Zeichenfolgen als Argument verwenden, sieht normalerweise so aus:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Der Datentyp für die beiden String-Parameter besteht aus mehreren Teilen:
- LP = langer Zeiger
- C = const
- T = TCHAR
- STR = Zeichenfolge
Was bedeutet nun TCHAR
? Dies hängt von der Plattform ab, die für die Erstellung des Programms ausgewählt wurde.
CopyFile
selbst ist nur ein Makro, das folgendermaßen definiert ist:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
Es gibt also eigentlich zwei CopyFile
Funktionen, und abhängig von den Compiler-Flags wird das CopyFile
Makro in eine der beiden CopyFile
.
Als Kern-Token wird TCHAR
definiert als:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Abhängig von den Compile-Flags ist TCHAR also ein "schmales" oder ein "breites" (2 Byte) Zeichen.
Wenn also UNICODE definiert ist, wird CopyFile
als CopyFileW
definiert, das 2-Byte-Zeichenarrays als Parameter verwendet, von denen erwartet wird, dass sie UTF-16-codiert sind.
Wenn UNICODE nicht definiert ist, wird CopyFile
als CopyFileA
definiert, das CopyFileA
-Zeichen-Arrays verwendet, von denen erwartet wird, dass sie in der Standard-ANSI-Codierung des aktuellen Benutzers codiert werden.
Es gibt zwei ähnliche Makros: UNICODE
lässt die Windows-APIs breite Zeichenfolgen erwarten und _UNICODE
(mit einem führenden Unterstrich), das ähnliche Funktionen in der C-Laufzeitbibliothek ermöglicht.
Diese Definitionen erlauben uns, Code zu schreiben, der sowohl im ANSI- als auch im Unicode-Modus kompiliert wird.
Es ist wichtig zu wissen, dass die ANSI-Kodierung eine Einzelbyte-Kodierung (dh latin-1) und eine Multibyte-Kodierung (dh shift jis) sein kann, obwohl utf-8 leider nicht gut unterstützt wird.
Dies bedeutet, dass weder die ANSI- noch die Wide-Character-Variante dieser Funktionen mit fester Breitencodierung arbeiten kann.