Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet förklarar hur Windows stöder Unicode-strängar för gränssnittselement, filnamn och så vidare (Unicode är den föredragna teckenkodningen eftersom den stöder alla teckenuppsättningar och språk).
Windows representerar Unicode-tecken med UTF-16-kodning, där varje tecken kodas som ett eller två 16-bitarsvärden. För att skilja dem från 8-bitars ANSI-tecken kallas UTF-16 tecken breda tecken. Visual C++-kompilatorn stöder den inbyggda datatypen wchar_t för breda tecken. Huvudfilen WinNT.h definierar även följande typedef.
typedef wchar_t WCHAR;
Om du vill deklarera en strängliteral med breda tecken eller en strängliteral med breda tecken placerar du L- före literalen.
wchar_t a = L'a';
wchar_t *str = L"hello";
I följande tabell visas några andra strängrelaterade typedefs:
| Typedef | Definition | 
|---|---|
| CHAR | char | 
| PSTR eller LPSTR | char* | 
| PCSTR eller LPCSTR | const char* | 
| PWSTR eller LPWSTR | wchar_t* | 
| PCWSTR eller LPCWSTR | const wchar_t* | 
Unicode- och ANSI-funktioner
När Microsoft introducerade Unicode-stöd för Windows underlättade det övergången genom att tillhandahålla två parallella uppsättningar API:er, en för ANSI-strängar och den andra för Unicode-strängar. Det finns till exempel två funktioner för att ange texten i ett fönsters namnlist:
- SetWindowTextA tar en ANSI-sträng.
 - SetWindowTextW tar en Unicode-sträng.
 
Internt översätter ANSI-versionen strängen till Unicode. Windows-huvuden definierar också ett makro som matchar Unicode-versionen när symbolen för förprocessorn UNICODE definieras eller ANSI-versionen på annat sätt.
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 
Funktionen dokumenteras under namnet SetWindowText, även om det verkligen är makronamnet, inte det faktiska funktionsnamnet.
Nya program bör alltid anropa Unicode-versionerna. Många världsspråk kräver Unicode. Om du använder ANSI-strängar är det omöjligt att lokalisera ditt program. ANSI-versionerna är också mindre effektiva eftersom operativsystemet måste konvertera ANSI-strängarna till Unicode vid körning. Beroende på vad du föredrar kan du anropa Unicode-funktionerna explicit, till exempel SetWindowTextWeller använda makrona. De senaste Windows-API:erna har vanligtvis bara en Unicode-version.
TCHARs
I vissa fall kan det vara användbart att kompilera samma kod för antingen ANSI- eller Unicode-strängar, beroende på målplattformen. Därför tillhandahåller Windows SDK makron som mappar strängar till Unicode eller ANSI, beroende på plattform.
| Makro | Unicode | ANSI | 
|---|---|---|
| TCHAR | wchar_t | 
char | 
              TEXT("x") eller _T("x") | 
L"x" | 
"x" | 
Till exempel följande kod:
SetWindowText(TEXT("My Application"));
resulterar i något av följande:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application");  // ANSI function.
TEXT och TCHAR makron är mindre användbara idag, eftersom alla program bör använda Unicode.
Rubrikerna för Microsoft C-körningsbiblioteken definierar en liknande uppsättning makron. 
              _tcslen löser till exempel till strlen om _UNICODE är odefinierat; annars löses det till wcslen, vilket är den bredare versionen av strlen.
#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 
Var försiktig: Vissa rubriker använder preprocessorsymbolen UNICODE, andra använder _UNICODE med ett understrecksprefix. Definiera alltid båda symbolerna. Visual C++ anger båda som standard när du skapar ett nytt projekt.