Dela via


Arbeta med strängar

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.

Nästa

Vad är ett fönster?