Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird erläutert, wie Windows Unicode-Zeichenfolgen für UI-Elemente, Dateinamen usw. unterstützt (Unicode ist die bevorzugte Zeichencodierung, da sie alle Zeichensätze und Sprachen unterstützt).
Windows stellt Unicode-Zeichen mithilfe der UTF-16-Codierung dar, bei der jedes Zeichen als ein oder zwei 16 Bit-Werte codiert wird. Um sie von 8 Bit-ANSI-Zeichen zu unterscheiden, werden UTF-16 Zeichen als breite Zeichen bezeichnet. Der Visual C++-Compiler unterstützt den integrierten Datentyp wchar_t für breite Zeichen. Die Headerdatei WinNT.h definiert auch die folgende Typedef.
typedef wchar_t WCHAR;
Wenn Sie ein Literal oder Zeichenfolgenliteral mit breiten Zeichen deklarieren möchten, setzen Sie L vor das Literal.
wchar_t a = L'a';
wchar_t *str = L"hello";
In der folgenden Tabelle sind einige andere zeichenfolgenbezogene Typedefs aufgeführt:
TypeDef | Definition |
---|---|
CHAR | char |
PSTR oder LPSTR | char* |
PCSTR oder LPCSTR | const char* |
PWSTR oder LPWSTR | wchar_t* |
PCWSTR oder LPCWSTR | const wchar_t* |
Unicode- und ANSI-Funktionen
Als Microsoft die Unicode-Unterstützung für Windows einführte, wurde der Übergang dadurch erleichtert, dass zwei parallele APIs bereitgestellt wurden, eine für ANSI-Zeichenfolgen und die andere für Unicode-Zeichenfolgen. Beispielsweise gibt es zwei Funktionen zum Festlegen des Texts der Titelleiste eines Fensters:
- SetWindowTextA akzeptiert eine ANSI-Zeichenfolge.
- SetWindowTextW akzeptiert eine Unicode-Zeichenfolge.
Intern übersetzt die ANSI-Version die Zeichenfolge in Unicode. Die Windows-Header definieren auch ein Makro, das zur Unicode-Version aufgelöst wird, wenn das Präprozessorsymbol UNICODE
definiert ist; andernfalls wird die ANSI-Version verwendet.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
Die Funktion wird unter dem Namen SetWindowText dokumentiert, obwohl dies eigentlich der Makroname ist und nicht der Name der Funktion.
Neue Anwendungen sollten immer die Unicode-Versionen aufrufen. Viele Sprachen der Welt erfordern Unicode. Wenn Sie ANSI-Zeichenfolgen verwenden, ist es nicht möglich, Ihre Anwendung zu lokalisieren. Die ANSI-Versionen sind auch weniger effizient, da das Betriebssystem die ANSI-Zeichenfolgen zur Laufzeit in Unicode konvertieren muss. Je nach Präferenz können Sie die Unicode-Funktionen explizit aufrufen, z. B. mit SetWindowTextW, oder die Makros verwenden. Die meisten neueren Windows-APIs verfügen in der Regel nur über eine Unicode-Version.
TCHARs
In manchen Fällen kann es sinnvoll sein, je nach Zielplattform denselben Code für ANSI- oder Unicode-Zeichenfolgen zu kompilieren. Dafür stellt das Windows SDK Makros bereit, die Zeichenfolgen je nach Plattform Unicode oder ANSI zuordnen.
Makro | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t |
char |
TEXT("x") oder _T("x") |
L"x" |
"x" |
Beispielsweise folgender Code:
SetWindowText(TEXT("My Application"));
wird folgendermaßen aufgelöst:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
Die Makros TEXT and TCHAR sind heute weniger nützlich, da alle Anwendungen Unicode verwenden sollten.
Die Header für die Microsoft C-Laufzeitbibliotheken definieren einen ähnlichen Satz von Makros. Beispielsweise wird _tcslen zu strlen aufgelöst, wenn _UNICODE
nicht definiert ist, andernfalls zu wcslen, der Breitzeichen-Version von strlen.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
Ab seien Sie vorsichtig: Einige Header verwenden das Präprozessorsymbol UNICODE
, andere verwenden _UNICODE
mit einem Unterstrichpräfix. Definieren Sie immer beide Symbole. Visual C++ legt standardmäßig beide fest, wenn Sie ein neues Projekt erstellen.