Search

terça-feira, 15 de abril de 2014

Unicode vs ANSI Char

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