Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tópico explica como o Windows suporta cadeias Unicode para elementos de interface, nomes de ficheiros, e assim por diante (o Unicode é a codificação de caracteres preferida porque suporta todos os conjuntos de caracteres e linguagens de caracteres).
O Windows representa caracteres Unicode usando codificação UTF-16, em que cada carácter é codificado como um ou dois valores de 16 bits. Para os distinguir dos caracteres ANSI de 8 bits, os caracteres UTF-16 são chamados caracteres wide . O compilador Visual C++ suporta o tipo de dado incorporado wchar_t para caracteres largos. O ficheiro de cabeçalho WinNT.h também define o seguinte typedef.
typedef wchar_t WCHAR;
Para declarar um literal de caracteres largos ou uma cadeia de caracteres largos, coloque L antes do literal.
wchar_t a = L'a';
wchar_t *str = L"hello";
A tabela seguinte lista algumas outras definições de tipo relacionadas com cadeias de carateres:
| Typedef | Definition |
|---|---|
| CHAR | char |
| PSTR ou LPSTR | char* |
| PCSTR ou LPCSTR | const char* |
| PWSTR ou LPWSTR | wchar_t* |
| PCWSTR ou LPCWSTR | const wchar_t* |
Important
Os tipos WCHAR e wchar_t são tipicamente descritos como representando caracteres Unicode. No entanto, é mais preciso dizer que representam unidades de código Unicode UTF-16. O Padrão Unicode® utiliza o termo carácter para se referir aos elementos de texto abstratos codificados pelo padrão, e unidade de código para se referir aos valores tipados usados para os representar numa forma de codificação Unicode. Na codificação UTF-16, os caracteres Unicode são codificados como uma ou duas unidades de código de 16 bits. Em Windows, WCHAR e wchar_t são sempre uma única unidade de código de 16 bits. Enquanto muitos caracteres Unicode são representados usando um único valor WCHAR ou wchar_t, muitos outros caracteres Unicode requerem uma sequência de dois desses valores. Estes pares de unidades de código UTF-16 são frequentemente referidos como pares substitutos, e cada um dos valores de 16 bits num par substitutos é conhecido como unidade de código substituto. Ao trabalhar com strings Unicode, é importante nunca tratar uma única unidade de código substituto como um carácter completo. Consulte Substitutos e Personagens Suplementares para mais informações.
Funções Unicode e ANSI
Quando a Microsoft introduziu o suporte Unicode no Windows, facilitou a transição ao fornecer dois conjuntos paralelos de APIs, um para strings ANSI e outro para strings Unicode. Por exemplo, existem duas funções para definir o texto da barra de título de uma janela:
- SetWindowTextA aceita uma cadeia ANSI.
- SetWindowTextW aceita uma cadeia Unicode.
Internamente, a versão ANSI traduz a cadeia para Unicode. Os cabeçalhos do Windows também definem uma macro que corresponde à versão Unicode quando o símbolo do pré-processador UNICODE está definido, ou à versão ANSI caso contrário.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
A função está documentada sob o nome SetWindowText, embora esse seja realmente o nome da macro, não o nome real da função.
As novas aplicações devem utilizar sempre as versões Unicode. Muitas línguas do mundo requerem Unicode. Se usares strings ANSI, será impossível localizar a tua aplicação. As versões ANSI também são menos eficientes, porque o sistema operativo tem de converter as strings ANSI para Unicode em tempo de execução. Dependendo da sua preferência, pode chamar explicitamente as funções Unicode, como SetWindowTextW, ou usar as macros. A maioria das APIs do Windows mais recentes normalmente tem apenas uma versão Unicode.
TCHARs
Em alguns casos, pode ser útil compilar o mesmo código para cadeias ANSI ou Unicode, dependendo da plataforma de destino. Para tal, o SDK do Windows fornece macros que mapeiam as strings para Unicode ou ANSI, dependendo da plataforma.
| Macro | Unicode | ANSI (Instituto Nacional Americano de Normalização) |
|---|---|---|
| TCHAR | wchar_t |
char |
TEXT("x") ou _T("x") |
L"x" |
"x" |
Por exemplo, o seguinte código:
SetWindowText(TEXT("My Application"));
corresponde a um dos seguintes:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
As macros TEXT e TCHAR são menos úteis atualmente, porque todas as aplicações deveriam usar Unicode.
Os cabeçalhos das bibliotecas de tempo de execução do Microsoft C definem um conjunto semelhante de macros. Por exemplo, _tcslen corresponde a strlen se _UNICODE não estiver definido; caso contrário, corresponde a wcslen, que é a versão para 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, outros usam _UNICODE com um prefixo de sublinhado. Define sempre ambos os símbolos. O Visual C++ define os dois por predefinição quando cria um novo projeto.