Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt uitgelegd hoe Windows Unicode-tekenreeksen ondersteunt voor UI-elementen, bestandsnamen, enzovoort (Unicode is de voorkeur voor tekencodering omdat deze ondersteuning biedt voor alle tekensets en talen).
Windows vertegenwoordigt Unicode-tekens met UTF-16-codering, waarbij elk teken wordt gecodeerd als een of twee 16-bits waarden. Als u deze wilt onderscheiden van 8-bits ANSI-tekens, worden UTF-16 tekens brede tekens genoemd. De Visual C++-compiler ondersteunt het ingebouwde gegevenstype wchar_t voor brede tekens. Het headerbestand WinNT.h definieert ook de volgende typedef-.
typedef wchar_t WCHAR;
Als u een teken dat een brede karaktervoorstelling is of een tekenreeks met brede karakters wilt declareren, plaatst u L vóór het literal.
wchar_t a = L'a';
wchar_t *str = L"hello";
De volgende tabel bevat enkele andere tekenreeksgerelateerde typedefs:
| Typedef | Definitie |
|---|---|
| CHAR | char |
| PSTR- of LPSTR- | char* |
| PCSTR- of LPCSTR- | const char* |
| PWSTR- of LPWSTR- | wchar_t* |
| PCWSTR- of LPCWSTR- | const wchar_t* |
Unicode- en ANSI-functies
Toen Microsoft Unicode-ondersteuning voor Windows introduceerde, werd de overgang eenvoudiger door twee parallelle sets API's te bieden, één voor ANSI-tekenreeksen en de andere voor Unicode-tekenreeksen. Er zijn bijvoorbeeld twee functies om de tekst van de titelbalk van een venster in te stellen:
- SetWindowTextA- een ANSI-tekenreeks gebruikt.
- SetWindowTextW een Unicode-tekenreeks gebruikt.
Intern vertaalt de ANSI-versie de tekenreeks naar Unicode. De Windows-headers definiëren ook een macro die wordt omgezet in de Unicode-versie wanneer het preprocessorsymbool UNICODE is gedefinieerd, of in de ANSI-versie bij gebrek daaraan.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
De functie wordt beschreven onder de naam SetWindowText, ook al is dat de macronaam, niet de werkelijke functienaam.
Nieuwe toepassingen moeten altijd de Unicode-versies aanroepen. Voor veel wereldtalen is Unicode vereist. Als u ANSI-tekenreeksen gebruikt, is het onmogelijk om uw toepassing te lokaliseren. De ANSI-versies zijn ook minder efficiënt, omdat het besturingssysteem de ANSI-tekenreeksen tijdens runtime moet converteren naar Unicode. Afhankelijk van uw voorkeur kunt u de Unicode-functies expliciet aanroepen, zoals SetWindowTextWof de macro's gebruiken. De meest recente Windows-API's hebben doorgaans slechts een Unicode-versie.
TCHARs
In sommige gevallen kan het handig zijn om dezelfde code te compileren voor ANSI- of Unicode-tekenreeksen, afhankelijk van het doelplatform. Hiervoor biedt de Windows SDK macro's die tekenreeksen toewijzen aan Unicode of ANSI, afhankelijk van het platform.
| Macro | Unicode | ANSI |
|---|---|---|
| TCHAR | wchar_t |
char |
TEXT("x") of _T("x") |
L"x" |
"x" |
Bijvoorbeeld de volgende code:
SetWindowText(TEXT("My Application"));
wordt omgezet in een van de volgende opties:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
De TEXT- en TCHAR- macro's zijn tegenwoordig minder nuttig, omdat alle toepassingen Unicode moeten gebruiken.
De headers voor de Microsoft C-runtimebibliotheken definiëren een vergelijkbare set macro's.
_tcslen wordt bijvoorbeeld omgezet in strlen- als _UNICODE niet is gedefinieerd; anders wordt het omgezet in wcslen, de brede versie van strlen.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
Wees voorzichtig: sommige kopteksten gebruiken het preprocessorsymbool UNICODE, andere gebruiken _UNICODE met een onderstrepingstekenvoorvoegsel. Definieer altijd beide symbolen. Visual C++ stelt ze beide standaard in wanneer u een nieuw project maakt.