Compartilhar via


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 dão suporte ao Unicode. Por exemplo, se você estiver portando o código que chama a função OpenFile , seu aplicativo poderá dar suporte a Unicode usando a função CreateFile .

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 numérica atoi e itoa usam apenas os dígitos de 0 a 9. Normalmente, mapear o Unicode para caracteres de 8 bits causa perda de dados, mas isso pode ser evitado tornando o código independente de tipo e tornando as expressões condicionais. As instruções no exemplo a seguir, gravadas para caracteres de 8 bits, são dependentes de tipo e devem ser alteradas para dar suporte ao Unicode.

char str[4] = "137";

int num = atoi(str);

Essas instruções podem ser reescritas da seguinte maneira para torná-las independentes de 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 converte Unicode para ASCII. O exemplo se baseia no fato de que os dígitos de 0 a 9 sempre podem ser convertidos 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 a função LCMapString do NLS (National Language Support) para processar texto que inclui os dígitos nativos fornecidos para alguns dos scripts no Unicode.

Cuidado

Usar a função wcstombs incorretamente pode comprometer a segurança do aplicativo. Verifique se o buffer de aplicativo para a cadeia de caracteres de 8 bits tem pelo menos o tamanho 2*(char_length +1), em que char_length representa o comprimento da cadeia de caracteres Unicode. Essa restrição é feita porque, com DBCSs ( conjuntos de caracteres de byte duplo ), 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 a segurança do aplicativo, consulte Considerações de segurança: recursos internacionais.

 

Usando Conjuntos de Caracteres e Unicode