Écriture, mappage et tri des caractères EUDC et PUA

Les applications écrivent des caractères définis par l’utilisateur final (EUDC) et des caractères de zone d’utilisation privée (PUA) sur l’écran ou l’imprimante tout comme elles écrivent d’autres caractères, à l’aide de fonctions de sortie telles que TextOut et ExtTextOut. Ces fonctions récupèrent automatiquement des informations de caractère à partir des polices de caractères EUDC ou PUA si EUDC est activé. Pour plus d’informations, consultez Caractères de User_Defined de fin et de zone d’utilisation privée.

Lors de l’écriture de caractères EUDC ou PUA, le fonctionnement de la fonction de sortie de texte dépend de la police actuellement sélectionnée. Si la police sélectionnée est une police de caractères EUDC ou PUA intégrée, la fonction récupère les informations de caractère de cette police. Si la police sélectionnée est une police TrueType de jeu de caractères d’octets double octet (DBCS) qui a une police EUDC distincte associée, la fonction récupère les informations de la police EUDC spécifiée. De même, si la police sélectionnée est une police Unicode TrueType qui a une police de caractères PUA distincte associée, la fonction récupère des informations à partir de la police de caractères PUA. Si la police sélectionnée n’a pas de police de caractère EUDC ou PUA associée, la fonction récupère des informations à partir de la police EUDC par défaut du système. Si le caractère n’est pas dans la police EUDC par défaut du système ou s’il n’existe pas de police EUDC par défaut, la fonction écrit le caractère par défaut défini par la police sélectionnée.

Les applications peuvent mapper des EUDC vers et à partir d’Unicode à l’aide des fonctions MultiByteToWideChar et WideCharToMultiByte . La fonction MultiByteToWideChar mappe la plupart des EUDC aux caractères du PUA Unicode. Toutefois, pour prendre en charge certaines normes nationales ou régionales, certains EUDC peuvent être mappés à des points de code Unicode non PUA. La fonction WideCharToMultiByte mappe un caractère dans le PUA à son équivalent EUDC, si un tel mappage existe et si le point de code n’a pas de mappage non PUA valide dans Unicode. Toutes les pages de code n’ont pas de plage EUDC. La page de code spécifiée dans un appel à WideCharToMultiByte doit contenir une plage de codes EUDC pour que le mappage à la plage EUDC se produise. Si la page de code ne contient pas de plage de codes EUDC, la fonction récupère le caractère par défaut des caractères du PUA Unicode.

MultiByteToWideChar et WideCharToMultiByte ne garantissent pas le mappage aller-retour. En d’autres termes, il est possible de commencer avec une chaîne multioctet particulière contenant des EUDC, de mapper la chaîne à Unicode avec MultiByteToWideChar et de la mapper au DBCS d’origine avec WideCharToMultiByte, et de terminer avec un résultat qui n’est pas identique à la chaîne d’origine. Les applications qui s’appuient sur le mappage des EUDC à Unicode doivent garantir que tous les caractères nécessaires peuvent aller-retour entre la zone EUDC de la page de code appropriée et le PUA Unicode.

Les applications ne doivent pas tenter de mapper les EUDC d’une page de code à une autre. Si une application commence avec un EUDC à partir d’une page de code, qu’elle la mappe à Unicode avec MultiByteToWideChar et qu’elle est mappée à un autre DBCS avec WideCharToMultiByte, il n’y a aucune garantie concernant les résultats. Le caractère d’origine peut être mappé à un autre EUDC dans la page de code de destination, ou il peut être mappé en tant que caractère non défini. De même, le mappage d’une chaîne Unicode à une page de code qui a une plage EUDC peut avoir des résultats inattendus. Si la chaîne Unicode contient un point de code PUA, il est possible que le point de code soit mappé à un EUDC qui ne représente pas le même caractère.

Les applications peuvent comparer des chaînes DBCS qui contiennent des EUDC à l’aide de la version ANSI de la fonction CompareString . La fonction mappe efficacement les caractères à Unicode avant de comparer les valeurs de caractères. Les applications peuvent créer une clé de tri pour la chaîne à l’aide de la version ANSI de la fonction LCMapString et de la valeur LCMAP_SORTKEY. Cette fonction mappe efficacement les caractères à Unicode en premier. Tous les caractères du PUA sont triés après tous les autres caractères Unicode. Dans la zone, les caractères sont triés dans l’ordre numérique. Si une application tente de récupérer des informations CTYPE pour un EUDC à l’aide de la fonction GetStringTypeA , la fonction récupère null pour chaque caractère.

Utilisation d’Unicode et de jeux de caractères