Arbeiten mit Zeichenfolgen
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.