Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie wyjaśniono, jak system Windows obsługuje ciągi Unicode dla elementów interfejsu użytkownika, nazw plików itd. (Unicode jest preferowanym kodowaniem znaków, ponieważ obsługuje wszystkie zestawy znaków i języki).
System Windows reprezentuje znaki Unicode przy użyciu kodowania UTF-16, w którym każdy znak jest zakodowany jako jedna lub dwie wartości 16-bitowe. Aby odróżnić je od 8-bitowych znaków ANSI, znaki UTF-16 są nazywane szerokimi znakami. Kompilator języka Visual C++ obsługuje wbudowany typ danych wchar_t dla znaków szerokich. Plik nagłówka WinNT.h definiuje również następujące typedef.
typedef wchar_t WCHAR;
Aby zadeklarować literał szerokiego znaku lub literał ciągu wieloznakowego, umieść L przed literałem.
wchar_t a = L'a';
wchar_t *str = L"hello";
W poniższej tabeli wymieniono niektóre inne definicje typów związane z ciągami.
| Typedef | Definicja |
|---|---|
| CHAR | char |
| PSTR lub LPSTR | char* |
| PCSTR lub LPCSTR | const char* |
| PWSTR lub LPWSTR | wchar_t* |
| PCWSTR lub LPCWSTR | const wchar_t* |
Funkcje Unicode i ANSI
Gdy firma Microsoft wprowadziła obsługę unicode dla systemu Windows, ułatwiła przejście, zapewniając dwa równoległe zestawy interfejsów API, jeden dla ciągów ANSI i drugi dla ciągów Unicode. Istnieją na przykład dwie funkcje ustawiania tekstu paska tytułu okna:
- setWindowTextA przyjmuje ciąg ANSI.
- SetWindowTextW przyjmuje ciąg Unicode.
Wewnętrznie wersja ANSI tłumaczy ciąg na Unicode. Nagłówki systemu Windows definiują również makro rozpoznawane jako wersja Unicode, gdy symbol preprocesora UNICODE jest zdefiniowany lub wersja ANSI w przeciwnym razie.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
Funkcja jest udokumentowana pod nazwą SetWindowText, mimo że jest to naprawdę nazwa makra, a nie rzeczywista nazwa funkcji.
Nowe aplikacje powinny zawsze wywoływać wersje Unicode. Wiele języków światowych wymaga unicode. Jeśli używasz ciągów ANSI, nie będzie można lokalizować aplikacji. Wersje ANSI są również mniej wydajne, ponieważ system operacyjny musi konwertować ciągi ANSI na Unicode w czasie wykonywania. W zależności od preferencji można jawnie wywołać funkcje Unicode, takie jak SetWindowTextWlub użyć makr. Najnowsze interfejsy API systemu Windows zwykle mają tylko wersję Unicode.
TCHARs
W niektórych przypadkach przydatne może być skompilowanie tego samego kodu dla ciągów ANSI lub Unicode, w zależności od platformy docelowej. W tym celu zestaw SDK systemu Windows udostępnia makra mapujące ciągi na Unicode lub ANSI, w zależności od platformy.
| Makro | Unicode | ANSI |
|---|---|---|
| TCHAR | wchar_t |
char |
TEXT("x") lub _T("x") |
L"x" |
"x" |
Na przykład następujący kod:
SetWindowText(TEXT("My Application"));
rozwiązuje się do jednego z następujących:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
Makra TEXT i TCHAR są obecnie mniej przydatne, ponieważ wszystkie aplikacje powinny używać formatu Unicode.
Nagłówki bibliotek czasu wykonywania języka Microsoft C definiują podobny zestaw makr. Na przykład _tcslen rozwiązuje się do strlen, jeśli _UNICODE jest niezdefiniowany; w przeciwnym razie rozwiązuje się do wcslen, który jest wersją szerokoznakową strlen.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
Należy zachować ostrożność: niektóre nagłówki używają symbolu preprocesora UNICODE, inne używają _UNICODE z prefiksem podkreślenia. Zawsze zdefiniuj oba symbole. Program Visual C++ ustawia je domyślnie podczas tworzenia nowego projektu.