Compartilhar via


Trabalhar com cadeias de caracteres

Este tópico explica como o Windows dá suporte a cadeias de caracteres Unicode para elementos da interface do usuário, nomes de arquivo e assim por diante (Unicode é a codificação de caracteres preferencial porque dá suporte a todos os conjuntos de caracteres e idiomas).

O Windows representa caracteres Unicode usando a codificação UTF-16, na qual cada caractere é codificado como um ou dois valores de 16 bits. Para distingui-los dos caracteres ANSI de 8 bits, os caracteres UTF-16 são chamados de caracteres largos. O compilador do Visual C++ dá suporte ao tipo de dados internos wchar_t para caracteres largos. O arquivo de cabeçalho WinNT.h também define o typedef a seguir.

typedef wchar_t WCHAR;

Para declarar um literal de caractere largo ou um literal de cadeia de caracteres largos, coloque L antes do literal.

wchar_t a = L'a';
wchar_t *str = L"hello";

A tabela a seguir lista alguns outros typedefs relacionados a cadeia de caracteres:

Typedef Definição
CHAR char
PSTR ou LPSTR char*
PCSTR ou LPCSTR const char*
PWSTR ou LPWSTR wchar_t*
PCWSTR ou LPCWSTR const wchar_t*

Funções Unicode e ANSI

Quando a Microsoft introduziu o suporte a Unicode no Windows, ela facilitou a transição fornecendo dois conjuntos paralelos de APIs, um para cadeias de caracteres ANSI e outro para cadeias de caracteres Unicode. Por exemplo, há duas funções para definir o texto da barra de título de uma janela:

  • SetWindowTextA recebe uma string ANSI.
  • SetWindowTextW recebe uma string Unicode.

Internamente, a versão ANSI converte a cadeia de caracteres em Unicode. Os cabeçalhos do Windows também definem uma macro que resolve para a versão Unicode quando o símbolo de pré-processador UNICODE é definido ou para a versão ANSI, em caso contrário.

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

A função é documentada sob o nome SetWindowText mesmo que esse seja realmente o nome da macro, e não o nome real da função.

Novos aplicativos sempre devem chamar as versões Unicode. Muitos idiomas do mundo exigem Unicode. Se você usar as cadeias de caracteres ANSI, será impossível localizar seu aplicativo. As versões ANSI também são menos eficientes, pois o sistema operacional deve converter as cadeias de caracteres ANSI em Unicode durante o tempo de execução. Dependendo de sua preferência, você pode chamar as funções Unicode explicitamente, como SetWindowTextW ou usar as macros. As APIs mais recentes do Windows normalmente têm apenas uma versão Unicode.

TCHARs

Em alguns casos, pode ser útil compilar o mesmo código para cadeias de caracteres ANSI ou Unicode, dependendo da plataforma de destino. Para esse fim, o SDK do Windows fornece macros que mapeiam cadeias de caracteres para Unicode ou ANSI, dependendo da plataforma.

Macro Unicode ANSI
TCHAR wchar_t char
TEXT("x") ou _T("x") L"x" "x"

Por exemplo, o código a seguir:

SetWindowText(TEXT("My Application"));

resolve para uma das seguintes opções:

SetWindowTextW(L"My Application"); // Unicode function with wide-character string.

SetWindowTextA("My Application");  // ANSI function.

As macros TEXT e TCHAR são menos úteis hoje, porque todos os aplicativos devem usar Unicode.

Os cabeçalhos das bibliotecas de tempo de execução do Microsoft C definem um conjunto semelhante de macros. Por exemplo, _tcslen resolve para strlen se _UNICODE é indefinido, caso contrário, ele resolve para wcslen que é a versão de caracteres largos de strlen.

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

Tenha cuidado: alguns cabeçalhos usam o símbolo do pré-processador UNICODE e outros usam _UNICODE com um prefixo de sublinhado. Sempre defina os dois símbolos. O Visual C++ define ambos por padrão quando você cria um novo projeto.

Próximo

O que é uma janela?