Trabalhar com Cordas

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.

Next

O que é uma janela?