Delen via


Werken met tekenreeksen

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.

Volgend

Wat is een venster?