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;
Um ein Breitzeichenliteral oder ein Breitzeichen-Zeichenfolgenliteral zu deklarieren, stellen Sie L dem Literal voran.
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* |
Important
Die Typen WCHAR und wchar_t werden in der Regel als Unicode-Zeichen beschrieben. Genauer gesagt, sie stellen Unicode UTF-16-Codeeinheiten dar. Der Unicode-Standard® verwendet das Ausdruckszeichen , um auf die abstrakten Textelemente zu verweisen, die vom Standard codiert sind, und codeeinheit , um auf die typierten Werte zu verweisen, die verwendet werden, um sie in einem Unicode-Codierungsformular darzustellen. In UTF-16-Codierung werden Unicode-Zeichen als eine oder zwei 16-Bit-Codeeinheiten codiert. In Windows sind WCHAR und wchar_t immer eine einzelne 16-Bit-Codeeinheit. Während viele Unicode-Zeichen mit einem einzelnen WCHAR- oder wchar_t-Wert dargestellt werden, benötigen viele andere Unicode-Zeichen eine Sequenz von zwei solchen Werten. Diese Paare von UTF-16-Codeeinheiten werden häufig als Ersatzpaare bezeichnet, und jeder der 16-Bit-Werte in einem Ersatzpaar wird als Ersatzcodeeinheit bezeichnet. Beim Arbeiten mit Unicode-Zeichenfolgen ist es wichtig, niemals eine einzelne Ersatzcodeeinheit als vollständiges Zeichen zu behandeln. Unter Surrogatpaare und ergänzende Zeichen finden Sie dazu weitere Informationen.
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
Vorsicht: Einige Header verwenden das Präprozessorsymbol UNICODE, andere verwenden _UNICODE mit vorangestelltem Unterstrich. Definieren Sie immer beide Symbole. Visual C++ legt standardmäßig beide fest, wenn Sie ein neues Projekt erstellen.