Tipos de dados do Windows para cadeias de caracteres

A maioria das operações de cadeia de caracteres pode usar a mesma lógica para Unicode e para páginas de código do Windows. A única diferença é que a unidade básica da operação é um caractere de 16 bits (também conhecido como um caractere largo) para Unicode e um caractere de 8 bits para páginas de código do Windows. Os arquivos de cabeçalho do Windows fornecem várias definições de tipo que facilitam a criação de fontes que podem ser compiladas para páginas de código Unicode ou para Windows.

O Windows dá suporte a três conjuntos de tipos de dados de caracteres e cadeias de caracteres: um conjunto de definições de tipo genérico que podem ser compiladas para páginas de código Unicode ou Windows e dois conjuntos de definições de tipo específicas. Um conjunto de definições de tipo específicas é para uso com Unicode e o outro é para uso com páginas de código do Windows.

Um aplicativo que usa tipos de dados genéricos pode ser compilado para Unicode simplesmente definindo "UNICODE" antes das instruções #include para os arquivos de cabeçalho ou durante a compilação. Novos aplicativos do Windows devem usar Unicode para evitar inconsistências de páginas de código variadas e simplificar a localização. Eles devem ser escritos com tipos de dados genéricos e devem definir "UNICODE" para compilar esses tipos em tipos Unicode. Nos poucos lugares em que um aplicativo deve trabalhar com dados de caracteres de 8 bits, ele pode fazer uso explícito dos tipos para páginas de código do Windows.

A capacidade de compilar os tipos genéricos em tipos para páginas de código do Windows existe principalmente para dar suporte a aplicativos herdados. Para compilar para páginas de código do Windows, o aplicativo apenas omite a definição UNICODE.

O exemplo a seguir mostra o método usado nos arquivos de cabeçalho do Windows para definir os três conjuntos de tipos de dados. Para a implementação, consulte o arquivo de cabeçalho Winnt.h.

// Generic types

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
    typedef unsigned char TCHAR;
#endif

typedef TCHAR *LPTSTR, *LPTCH;

// 8-bit character specific

typedef unsigned char CHAR;
typedef CHAR *LPSTR, *LPCH;

// Unicode specific (wide characters)

typedef unsigned wchar_t WCHAR;
typedef WCHAR *LPWSTR, *LPWCH;

A letra "T" em uma definição de tipo, por exemplo, TCHAR ou LPTSTR, designa um tipo genérico que pode ser compilado para páginas de código do Windows ou Unicode. A letra "W" em uma definição de tipo, por exemplo, WCHAR ou LPWSTR, designa um tipo Unicode. Como as páginas de código do Windows são do formulário mais antigo, elas têm definições de tipo simples, como CHAR e LPSTR. Para obter uma descrição completa dos tipos de dados no Windows, consulte Tipos de dados do Windows.

Unicode na API do Windows