Article de reference

UTF-32

L'UTF-32 ( format de transformation Unicode 32 bits ), parfois appelé UCS-4, est un encodage à longueur fixe utilisé pour encoder les points de code Unicode. Chaque point de cod...

L'UTF-32 ( format de transformation Unicode 32 bits ), parfois appelé UCS-4, est un encodage à longueur fixe utilisé pour encoder les points de code Unicode. Chaque point de code utilise exactement 32 bits (quatre octets ), mais certains bits de poids fort doivent être nuls car il existe bien moins de 2 <sup>32</sup> points de code Unicode, 2<sup>1</sup> bits étant nécessaires. En revanche, tous les autres formats de transformation Unicode sont des encodages à longueur variable. Chaque valeur de 32 bits en UTF-32 représente un point de code Unicode et correspond exactement à sa valeur numérique.

Le principal avantage de l'UTF-32 réside dans l'indexation directe des points de code Unicode. La recherche du Nième point de code dans une séquence s'effectue en temps constant . À l'inverse, un code de longueur variable nécessite un temps linéaire pour compter les N premiers points de code à partir du début de la chaîne. L'UTF-32 remplace ainsi facilement le code utilisant des entiers incrémentés de un pour examiner chaque position dans une chaîne , comme c'était le cas couramment pour l'ASCII . Les programmeurs débutants surestiment souvent son utilité.

Le principal inconvénient de l'UTF-32 est son utilisation gourmande en espace, puisqu'il utilise quatre octets par point de code, dont 11 bits toujours à zéro. Les caractères au-delà du BMP sont relativement rares dans la plupart des textes (sauf, par exemple, dans le cas de textes contenant certains émojis populaires) et peuvent généralement être ignorés pour l'estimation de la taille. De ce fait, l'UTF-32 est presque deux fois plus volumineux que l'UTF-16 . Il peut être jusqu'à quatre fois plus volumineux que l'UTF-8 selon le nombre de caractères appartenant au sous-ensemble ASCII .

ISO/IEC 10646 d'origine définit un format d'encodage 32 bits appelé UCS-4 , dans lequel chaque point de code du jeu de caractères universel (UCS) est représenté par une valeur 31 bits comprise entre 0 et 0x7FFFFFFF (le bit de signe étant nul et inutilisé). En novembre 2003, la RFC 3629 a restreint Unicode afin de respecter les contraintes de l' encodage UTF-16 : les points de code supérieurs à U+10FFFF (ainsi que les substituts haut et bas U+D800 à U+DFFF) sont explicitement interdits. Ce sous-ensemble limité définit UTF-32. Bien que la norme ISO ait (en 1998, dans Unicode 2.1) « réservé à un usage privé » les plages de valeurs 0xE00000 à 0xFFFFFF et 0x60000000 à 0x7FFFFFFF ces plages ont été supprimées dans les versions ultérieures. Le document « Principes et procédures » du groupe de travail 2 du comité technique conjoint ISO/CEI 1/SC 2 stipule que toutes les futures attributions de points de code seront limitées à la plage Unicode. Par conséquent, l’UTF-32 pourra représenter tous les points de code UCS et l’UTF-32 et l’UCS-4 sont identiques.

Utilité de largeur fixe

Un nombre fixe d'octets par point de code présente des avantages théoriques, mais chacun de ces avantages pose problème en pratique :

  • La troncature devient plus facile, mais pas de manière significative par rapport à UTF-8 et UTF-16 (qui peuvent tous deux rechercher le point de troncature en remontant jusqu'à 2 à 4 unités de code au maximum). problème en O(1) , tandis qu'il est en O(n) dans un encodage à largeur variable. Cependant, ce qu'un utilisateur pourrait appeler un « caractère » est toujours de largeur variable, par exemple la séquence de caractères combinatoires les polices « à chasse fixe » ont une largeur variable, souvent les idéogrammes CJK sont deux fois plus larges, plus les problèmes déjà mentionnés avec le nombre de points de code qui n'est pas égal au nombre de caractères.

Utiliser

L'utilisation principale de l'UTF-32 se situe au niveau des API internes, où les données sont des points de code uniques ou des glyphes , et non des chaînes de caractères. Par exemple, dans le rendu de texte moderne, la dernière étape consiste généralement à créer une liste de structures contenant chacune des coordonnées (x, y) , des attributs et un point de code UTF-32 identifiant le glyphe à afficher. Les informations non Unicode sont souvent stockées dans les 11 bits « inutilisés » de chaque mot.wchar_t est codé sur 16 bits) est quasi inexistante. Sous Unix, les chaînes UTF-32 sont parfois, mais rarement, utilisées en interne par les applications, car le type wchar_t est défini sur 32 bits.Les versions de Python jusqu'à la version 3.2 peuvent être compilées pour utiliser des chaînes UTF-32 au lieu d' UTF-16 ; à partir de la version 3.3, les chaînes Unicode sont stockées en UTF-32 si elles contiennent au moins un caractère non BMP , mais les octets nuls de début sont optimisés « en fonction du point de code ayant le plus grand ordinal Unicode (1, 2 ou 4 octets) » afin que tous les points de code aient cette taille.

Le langage de programmation Julia s'est éloigné de la prise en charge intégrée de l'UTF-32 avec sa version 1.0, simplifiant le langage pour n'avoir que des chaînes UTF-8 (tous les autres encodages étant considérés comme hérités et déplacés de la bibliothèque standard vers le package ) suivant le « Manifeste UTF-8 partout ».

C++11 possède deux types de données intégrés utilisant l'UTF-32. Le char32_tpremier stocke un caractère encodé en UTF-32. Le second stocke une chaîne de caractères encodés en UTF-32. Un caractère ou une chaîne littérale encodée en UTF-32 est marqué par un caractère ou une chaîne littérale u32stringencodée en UTF-32 . U

; // défini comme `const char32_t*´

C# possède une UTF32Encodingclasse qui représente les caractères Unicode sous forme d'octets, plutôt que sous forme de chaîne de caractères.

Variantes

Bien que techniquement invalides, les moitiés de substitution sont souvent encodées et autorisées. Cela permet de traduire des caractères UTF-16 invalides (comme les noms de fichiers Windows) en UTF-32, à l'instar de la variante WTF-8 de l'UTF-8. Parfois, des paires de substitution sont encodées à la place de caractères non BMP, comme pour CESU-8 . En raison du grand nombre de valeurs 32 bits inutilisées, il est également possible de préserver des caractères UTF-8 invalides en utilisant des valeurs non Unicode pour encoder les erreurs UTF-8, bien qu'il n'existe aucune norme à ce sujet.

UTF-32 possède 2 versions pour big-endian et little-endian : UTF-32-BE et UTF-32-LE .