Ansi char e unicode
Hoje em dia a localização é uma obrigação para o sucesso de um aplicativo.Um problema real na localização é a manipulação de uma variedade de entradas diferentes do usuário.
Antigamente era natural a manipulação de strings ser realizada por uma array do tipo char terminadas com zero. Acontece que alguns países possuem um sistema de escrita com milhares de caracteres( china e japão por exemplo ) e o padrão Ansi suporta apenas 256 caracteres, e cada algarismo ocupa 1 byte.
O padrão UNICODE
Nas versões mais novas do windows, todo algarismo é representado no formato UNICODE. Cada algarismo no formato UNICODE possui o formato UTF-16, nesse padrão cada algarismo possui 2 bytes.O UTF-8 encoda alguns algarismos com 1 byte, alguns algarismos com 2 bytes, alguns com 3 bytes e alguns com 4 bytes. Algarismos com o valor abaixo de 0x0080 possuem 1 byte e tem seu uso em textos escritos em inglês, algarismos com o valor entre 0x0080 e 0x07FF possuem 2 bytes, são usualmente textos europeus, algarismos com o valor maior que 0x0800 usam 3 bytes normalmente textos asiáticos.
UTF-32 Encoda todos os algarismos com 4 bytes cada um. tornando a programação para esse tipo de text-encode mais simples.
Exemplo de um Texto ANSI usando 1 byte por algarismo
char alg = 'a';
Exemplo de um array de caracteres formando uma string;
char szTexto[10] = "um Texto.";
O visual Studio considera que o tipo wchar_t representa o UTF-16, como esse tipo não existia em alguns compiladores antigos, para usar ele em código legado devemos delara-lo:
typedef unsigned short wchar_t;
Mas devemos fazer isso apenas em códigos muito antigos.
Aqui o exemplo de um Texto escrito com UTF-16
wchar_t alg = L'a'; // wchar siginifica wide char
Um simples array:
wchar_t sztexto[10] = L"Um texto.";
A letra L antes do texto indica al compilador o valor literal da variável, indicando que ela deve ser compilada como UNICODE.
No visual Studio existe uma opção nas propriedades do projeto para informar ao compilador qual o padrão será adotado.
Podemos observar no código abaixo como o Visual Studio trata essa diferença em tempo de execução:
#ifdef UNICODE typedef WCHAR TCHAR, *PTCHAR, PTSTR; typedef CONST WCHAR *PCTSTR; #define __TEXT(quote) quote // r_winnt #define __TEXT(quote) L##quote #else typedef CHAR TCHAR, *PTCHAR, PTSTR; typedef CONST CHAR *PCTSTR; #define __TEXT(quote) quote #endif
Bom sempre utilizaremos o padrão UNICODE em todos os exemplos deste blog. Pois assim teremos a certeza de que o projeto vai funcionar em qualquer cultura escolhida pelo usuário. Falaremos mais tarde sobre o padrão stl::string
Nenhum comentário:
Postar um comentário