Usando funções que não têm equivalentes Unicode
As funções que não foram implementadas com uma versão Unicode normalmente foram substituídas por funções mais poderosas ou estendidas que suportam Unicode. Por exemplo, se estiver a portar código que chama a função OpenFile, a sua aplicação pode oferecer suporte a Unicode ao usar a função CreateFile em vez disso.
Se uma função não tiver equivalente Unicode, o aplicativo poderá mapear caracteres de e para conjuntos de caracteres de 8 bits antes e depois da chamada de função. Por exemplo, as funções de formatação de números atoi e itoa usam apenas os dígitos de 0 até 9. Normalmente, o mapeamento de Unicode para caracteres de 8 bits causa perda de dados, mas isso pode ser evitado tornando o código independente do tipo e condicionando as expressões. As instruções no exemplo a seguir, escritas para caracteres de 8 bits, dependem do tipo e devem ser alteradas para oferecer suporte a Unicode.
char str[4] = "137";
int num = atoi(str);
Essas declarações podem ser reescritas da seguinte forma para torná-las independentes do tipo.
TCHAR tstr[4] = TEXT("137");
#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
// room for the multibyte characters if they are two
// bytes long and a terminating null character. See Security
// Alert below.
wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);
#else
int num = atoi(tstr);
#endif
Neste exemplo, a função de biblioteca C padrão wcstombs traduz Unicode para ASCII. O exemplo baseia-se no fato de que os dígitos de 0 a 9 sempre podem ser traduzidos de Unicode para ASCII, mesmo que parte do texto ao redor não possa. A função atoi para em qualquer caractere que não seja um dígito.
Seu aplicativo pode usar o National Language Support (NLS) a função LCMapString para processar texto que inclui os dígitos nativos fornecidos para alguns dos scripts em Unicode.
Atenção
Usar o wcstombs função incorretamente pode comprometer a segurança do seu aplicativo. Certifique-se de que o buffer do aplicativo para a cadeia de caracteres de 8 bits é pelo menos de tamanho 2*(char_length +1), onde char_length representa o comprimento da cadeia de caracteres Unicode. Essa restrição é feita porque, com conjuntos de caracteres de byte duplo (DBCSs), cada caractere Unicode pode ser mapeado para dois caracteres consecutivos de 8 bits. Se o buffer não mantiver a cadeia de caracteres inteira, a cadeia de caracteres de resultado não será terminada em nulo, representando um risco de segurança. Para obter mais informações sobre segurança de aplicativos, consulte Considerações de segurança: recursos internacionais.
Tópicos relacionados