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.

Nächste

Was ist ein Fenster?