Partager via


Utilisation de fonctions qui n’ont pas d’équivalent Unicode

Les fonctions qui n’ont pas été implémentées avec une version Unicode ont généralement été remplacées par des fonctions plus puissantes ou étendues qui prennent en charge Unicode. Par exemple, si vous portez du code qui appelle la fonction OpenFile , votre application peut prendre en charge Unicode à l’aide de la fonction CreateFile à la place.

Si une fonction n’a pas d’équivalent Unicode, l’application peut mapper des caractères vers et à partir de jeux de caractères 8 bits avant et après l’appel de fonction. Par exemple, les fonctions de mise en forme de nombre atoi et itoa utilisent uniquement les chiffres 0 à 9. Normalement, le mappage d’Unicode à des caractères 8 bits entraîne la perte de données, mais cela peut être évité en rendant le type de code indépendant du type et en rendant les expressions conditionnelles. Les instructions de l’exemple suivant, écrites pour des caractères 8 bits, dépendent du type et doivent être modifiées pour prendre en charge Unicode.

char str[4] = "137";

int num = atoi(str);

Ces instructions peuvent être réécrites comme suit pour les rendre indépendantes du type.

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 

Dans cet exemple, la fonction de bibliothèque C standard wcstombs traduit Unicode en ASCII. L’exemple repose sur le fait que les chiffres 0 à 9 peuvent toujours être traduits d’Unicode en ASCII, même si une partie du texte environnant ne le peut pas. La fonction atoi s’arrête à n’importe quel caractère qui n’est pas un chiffre.

Votre application peut utiliser la fonction LCMapString (National Language Support) pour traiter du texte qui inclut les chiffres natifs fournis pour certains scripts dans Unicode.

Attention

L’utilisation incorrecte de la fonction wcstombs peut compromettre la sécurité de votre application. Assurez-vous que la mémoire tampon d’application pour la chaîne de caractères 8 bits est d’au moins de taille 2*(char_length +1), où char_length représente la longueur de la chaîne Unicode. Cette restriction est effectuée car, avec des jeux de caractères codés sur deux octets (DBCS), chaque caractère Unicode peut être mappé à deux caractères 8 bits consécutifs. Si la mémoire tampon ne contient pas la chaîne entière, la chaîne de résultat n’est pas terminée par null, ce qui présente un risque de sécurité. Pour plus d’informations sur la sécurité des applications, consultez Considérations relatives à la sécurité : fonctionnalités internationales.

 

Utilisation d’Unicode et de jeux de caractères