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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow