Utilisation de types de données génériques

Si vous utilisez des types de données génériques dans votre code, vous pouvez les compiler pour Unicode simplement à l’aide d’une directive de préprocesseur pour définir « UNICODE » avant les instructions #include pour les fichiers d’en-tête. Pour compiler le code pour les pages de code Windows (ANSI), omettez la définition « UNICODE ». Les nouvelles applications Windows doivent utiliser Unicode pour éviter les incohérences des pages de code variées et simplifier la localisation.

Pour créer du code source qui peut être compilé pour utiliser des caractères et des chaînes Unicode ou pour utiliser des caractères et des chaînes à partir de pages de code Windows :

  1. Utilisez des types de données génériques, tels que TCHAR, LPTSTR et LPTCH, pour tous les types de caractères et de chaînes utilisés pour le texte. Pour plus d’informations sur les types génériques, consultez Types de données Windows pour les chaînes.

  2. Assurez-vous que les pointeurs vers des mémoires tampons de données non textuelles ou des tableaux d’octets binaires sont codés avec des types de données tels que LPBYTE ou LPWORD, au lieu du type LPTSTR ou LPTCH.

  3. Déclarez explicitement les pointeurs de type indéterminé en tant que pointeurs vides à l’aide de LPVOID comme il convient.

  4. Rendre le pointeur arithmétique indépendant du type. L’utilisation d’unités de taille TCHAR génère des variables de 2 octets si UNICODE est défini et de 1 octet si UNICODE n’est pas défini. L’utilisation de l’arithmétique de pointeur retourne toujours le nombre d’éléments indiqués par le pointeur, que les éléments ont une taille de 1 ou 2 octets. L’expression suivante récupère toujours le nombre d’éléments, qu’UNICODE soit défini ou non.

    cCount = lpEnd - lpStart;
    

    L’expression suivante détermine le nombre d’octets utilisés.

    cByteCount = (lpEnd - lpStart) * sizeof(TCHAR);
    

    Il n’est pas nécessaire de modifier une instruction comme la suivante, car l’incrément du pointeur pointe vers l’élément de caractère suivant.

    chNext = *++lpText;
    
  5. Remplacez les chaînes littérales et les constantes de caractères de manifeste par des macros. Modifiez des expressions comme celle-ci.

    while(*lpFileName++ != '\\')
    {
        // ...
    }
    

    Utilisez la macro TEXT comme suit dans cette expression.

    while(*lpFileName++ != TEXT('\\'))
    {
        // ...
    }
    

    La macro TEXT entraîne l’évaluation des chaînes en tant que L"string » lorsque UNICODE est défini, et en tant que « string » dans le cas contraire. Pour faciliter la gestion, déplacez les chaînes littérales dans les ressources, en particulier si elles contiennent des caractères en dehors de la plage ASCII (0x00 via 0x7F) ou si elles sont exposées à l’interface utilisateur. Pour prendre en charge la localisation de votre application pour différentes langues nationales, il est très important que toutes les chaînes d’interface utilisateur soient dans des ressources localisables.

  6. Utilisez les versions génériques des fonctions Windows. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.

  7. Utilisez les versions génériques des fonctions de chaîne de bibliothèque C standard et n’oubliez pas de définir « _UNICODE » ainsi que « UNICODE », comme indiqué dans Fonctions C standard.

  8. Si vous adaptez une application écrite à l’origine pour les pages de code Windows, n’oubliez pas de modifier tout code qui s’appuie sur 255 comme valeur la plus grande pour un caractère.

Lorsque vous compilez le code que vous avez écrit comme indiqué ci-dessus, le compilateur peut créer des versions de page de code Unicode et Windows de votre application à partir de la même source. Selon les définitions d’UNICODE, les fonctions génériques sont résolues pour produire les mêmes fichiers binaires que si vous écriviez du code exclusivement pour Unicode ou exclusivement pour des pages de code Windows.

Utilisation d’Unicode et de jeux de caractères