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;

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.

Weiter

Was ist ein Fenster?