Format de codage standard Unicode-UTF-8-16-32

Format de codage standard Unicode-UTF-8-16-32

Adresse de téléchargement UnicodeStandard-15.0-pdf

Cet article décrit les formats de codage de caractères standard Unicode, notamment UTF-8, UTF-16 et UTF-32, ainsi que leurs caractéristiques et différences respectives.

L'implémentation réelle dans les systèmes informatiques représente un nombre entier d'une unité de code spécifique d'une taille spécifique, généralement 8 bits (= octets), 16 bits ou 32 bits. Dans le modèle de codage de caractères Unicode, une forme de codage définie avec précision spécifie comment chaque entier (point de code) d'un caractère Unicode est représenté comme une séquence d'une ou plusieurs unités de code. La norme Unicode propose trois formes de codage différentes pour les caractères Unicode, en utilisant des unités de 8 bits, 16 bits et 32 ​​bits. Ils sont nommés respectivement UTF-8, UTF-16et UTF-32. « UTF » est une continuation du terme antérieur « Format de transformation Unicode (ou UCS) ». Chacune de ces trois formes de codage constitue un mécanisme tout aussi légal pour représenter les caractères Unicode ; chaque méthode présente des avantages dans des circonstances différentes.

Les trois codages peuvent être utilisés pour représenter tous les caractères codés dans la norme Unicode ; ils sont donc entièrement interopérables pour les implémentations qui peuvent choisir des codages différents pour diverses raisons. Chacune de ces trois formes de codage Unicode peut être convertie efficacement vers les deux autres formes sans aucune perte de données.

Dans la figure 2-11, la ligne UTF-32 montre que chaque exemple de caractère peut être représenté par une unité de code de 32 bits. La valeur de ces unités de code est la même que la valeur du point de code du caractère. Avec UTF-16, la plupart des caractères peuvent être représentés par une seule unité de code de 16 bits dont la valeur est la même que le point de code du caractère, mais les caractères avec des valeurs de point de code élevées nécessitent une paire d'unités de code de substitution de 16 bits. En UTF-8, les caractères peuvent être représentés par un, deux, trois ou quatre octets, et la relation entre ces valeurs d'octets et les valeurs de points de code est plus complexe.

Les différences entre les trois formats d’encodage Unicode :
formulaires d'encodage unicode

UTF-32

UTF-32 est la forme la plus simple de codage Unicode. Chaque point de code Unicode est représenté directement par une unité de code de 32 bits. Par conséquent, UTF-32 a une relation un à un entre les caractères codés et les unités de codage ; il s’agit d’une forme de codage de caractères à largeur fixe.

Les implémentations qui utilisent généralement UTF-8 ou UTF-16 convertissent parfois temporairement les chaînes en UTF-32 pour un traitement plus facile.

Il existe certains cas d'utilisation dans lesquels des séquences de points de code multiples sont utiles ou nécessaires en tant qu'unités de traitement ; par exemple, des clusters de graphèmes ou des séquences de caractères avec des classes de combinaison non nulles. Cela peut limiter l'utilité du codage à largeur fixe par point de code.

Les formes d'encodage de chaînes comme UTF-32 ou UTF-8 n'ont rien à voir avec les API qui transmettent des valeurs à un seul caractère : elles acceptent ou renvoient généralement des entiers de points de code simples.

Comme pour toutes les formes de codage Unicode, UTF-32 se limite à représenter des points de code dans la plage 0... D7FF16et E00016... , c'est-à-dire des valeurs scalaires Unicode. 10FFFF16Cela garantit l’interopérabilité avec les formulaires codés UTF-16 et UTF-8.

Largeur fixe . La valeur de chaque unité de code UTF-32 correspond exactement à la valeur du point de code Unicode. Cette situation est très différente de celle de l'UTF-16 et surtout de l'UTF-8, où les valeurs des unités de code changent souvent de manière méconnaissable par rapport aux valeurs des points de code. Par exemple, U+10000en UTF-32, il est représenté par <00010000>et en UTF-8, il est représenté par <F0 90 80 80>. Avec UTF-32, la détermination des caractères Unicode à partir de la représentation de l'unité de code UTF-32 est simple. En revanche, les représentations UTF-16 et UTF-8 nécessitent généralement une conversion d'unité de code avant que les caractères puissent être reconnus dans la carte de code Unicode.

Utilisation privilégiée . UTF-32 est probablement une forme de codage préférée où la mémoire ou l'espace de stockage sur disque pour les caractères n'est pas particulièrement important, mais où un accès par unité de code unique à largeur fixe aux caractères est requis. Par exemple, une chaîne Python3 est une séquence de points de code Unicode.

UTF-16

Dans la forme codée UTF-16, les points de code non substituts dans la plage U+0000... U+FFFFsont représentés comme une seule unité de code de 16 bits ; les points de code dans le plan supplémentaire dans la plage U+10000... sont représentés comme une paire de 16 bits. unités de code binaire. U+10FFFFCes paires spéciales d'unités de code sont appelées paires de substitution . Les valeurs utilisées pour les unités de code entourant les paires de portes sont complètement séparées des unités de code utilisées pour les représentations d'unités de code individuelles, de sorte que toutes les représentations de points de code dans UTF-16 ne se chevauchent pas. Pour une définition formelle d'un agent, voir la Section 3.8 « Agent » .

Optimisé pour BMP . UTF-16 optimise la représentation des caractères dans le plan multilingue de base (BMP), c'est-à-dire les caractères compris entre U+0000... U+FFFF, à l'exclusion des points de code environnants. Cette gamme contient la grande majorité des caractères communs à tous les scripts modernes dans le monde, ne nécessitant qu'une seule unité de code de 16 bits par caractère et nécessitant donc la moitié de la mémoire ou de l'espace de stockage de la forme codée UTF-32. Pour BMP, UTF-16 peut effectivement être considéré comme une forme d’encodage à largeur fixe.

Personnages et agents supplémentaires . Pour les caractères supplémentaires, UTF-16 nécessite deux unités de code de 16 bits. La différence entre un caractère représenté par une et deux unités de code de 16 bits signifie que UTF-16 est un codage à largeur variable. Ce fait peut entraîner des difficultés de mise en œuvre s'il n'est pas soigneusement pris en compte ; UTF-16 est un peu plus compliqué que UTF-32.

Utilisation privilégiée . UTF-16 sera probablement le codage préféré dans de nombreux environnements qui nécessitent un équilibre entre un accès efficace aux caractères et une utilisation économique du stockage. Il est compact et tous les caractères couramment utilisés tiennent dans une unité de code de 16 bits.

Origine . UTF-16 est le descendant historique de la première forme d'Unicode, conçue à l'origine pour utiliser exclusivement un codage de 16 bits à largeur fixe. Des substituts sont ajoutés pour U+FFFFfournir une forme codée pour les caractères supplémentaires aux points de code dépassés. La conception des substituts en fait un mécanisme d'extension simple et efficace qui fonctionne bien avec les anciennes implémentations Unicode et évite de nombreux problèmes liés aux autres codages de caractères à largeur variable. Pour plus d'informations sur les proxys et leur gestion, consultez la Section 5.4 Gestion des paires de proxys dans UTF-16 .

Tri binaire . Aux fins du tri du texte, si le texte contient des points de code supplémentaires, l'ordre binaire des données représentées sous la forme codée UTF-16 diffère de l'ordre des points de code. Cela signifie que l’ordre des points de code nécessite une implémentation de comparaison légèrement différente. Pour plus d'informations, consultez la Section 5.17, Ordre binaire .

UTF-8

Pour répondre aux exigences des systèmes ASCII orientés octets, la norme Unicode spécifie une troisième forme de codage : UTF-8. Cette forme de codage à largeur variable maintient la transparence de l'ASCII en utilisant des unités de code sur 8 bits.

Orienté octet . De nombreux logiciels et pratiques existants dans le domaine des technologies de l'information reposent depuis longtemps sur la représentation des données de caractères sous forme de séquences d'octets. De plus, de nombreux protocoles s'appuient non seulement sur les valeurs ASCII pour rester inchangées, mais doivent également tirer parti ou éviter des valeurs d'octets spéciales pouvant avoir des fonctions de contrôle associées. Le moyen le plus simple d'adapter une implémentation Unicode à cette situation consiste à utiliser une forme de codage déjà définie en unités de code de 8 bits pour représenter tous les caractères Unicode sans interférer ni réutiliser les valeurs de code de contrôle ASCII ou C0. Il s'agit d'une fonctionnalité de l'UTF-8.

Largeur variable . UTF-8 est une forme de codage à largeur variable qui utilise des unités de code de 8 bits, où les bits de poids fort de chaque unité de code représentent la partie de la séquence d'unités de code à laquelle appartient chaque octet. Réservez une plage de valeurs unitaires de code 8 bits pour le premier ou le premier élément d'une séquence d'unités de code UTF-8, et une plage complètement distincte de valeurs unitaires de code 8 bits pour les éléments suivants ou de fin d'un tel séquence ; cette convention est prédéterminée pour UTF-8 8 assure le non-chevauchement. Le tableau 3-6 montre comment les bits des points de code Unicode sont répartis entre les octets sous la forme codée UTF-8. Pour une définition formelle complète d'UTF-8, voir Section 3.9, « Formulaires de codage Unicode » .
Carte de distribution UTF-8 bits
Le tableau 3-6 spécifie la distribution des bits de la forme codée UTF-8, montrant la plage de valeurs scalaires Unicode correspondant aux séquences d'un octet, deux octets, trois octets et quatre octets. "x" représente la valeur distribuée à droite -1 octet (le plus bas), "y" représente la valeur distribuée à droite -2 octets, "z" représente la valeur distribuée à droite -3 octets, "u" représente le valeur distribuée à droite -3 octets. Question : Les "u" et "z" dans les premier et deuxième octets de la dernière ligne ne sont pas alignés en fonction de l'octet entier.

Le tableau 3-7 répertorie toutes les séquences d'octets bien formées pour UTF-8. Une plage de valeurs d'octets (telles que A0... ) indique que tout octet de BFA0 à BF (et inclus A0) est bien formé à cette position. BFToute valeur d'octet en dehors de la plage répertoriée est mal formée. Par exemple:

  • La séquence d'octets C0 AFest mal formée car C0son format est incorrect dans la colonne "Premier octet".
  • La séquence d'octets E0 9F 80est mal formée car dans E0une ligne où le premier octet est bien formé, 9Fle deuxième octet est mal formé.
  • La séquence d'octets F4 80 83 92est bien formée car chaque octet de la séquence correspond à la plage d'octets d'une ligne du tableau (la dernière ligne).

Séquence d'octets UTF-8 bien formée
Dans le Tableau 3-7, les cas où la plage d'octets de fin n'est pas 80... sont indiqués en italique gras pour attirer l'attention. BFCes exceptions en mode général se produisent uniquement dans le deuxième octet de la séquence.

ASCII transparent . Le codage UTF-8 maintient la transparence de tous les points de code ASCII ( 0x000x7F). Cela signifie que les points de code Unicode U+0000... U+007Fsont convertis en octets simples en UTF-8 0x00... 0x7Fet sont donc impossibles à distinguer de l'ASCII lui-même. De plus, comme pour la représentation de tout autre point de code Unicode, la valeur 0x00... 0x7Fn'apparaît dans aucun octet, il n'y a donc aucune ambiguïté. En plus de la plage ASCII d'Unicode, de nombreux scripts non idéographiques sont représentés par deux octets par point de code en UTF-8 ; tous les points de code non de substitution entre U+0800et sont représentés par trois octets ; le code supplémentaire pour le bit ci-dessus nécessite quatre octets.U+FFFFU+FFFF

Taille des données . UTF-8 est assez compact en termes de nombre d'octets utilisés. Par rapport à l'UTF-16, il est beaucoup plus petit pour la syntaxe ASCII et les langues occidentales, mais beaucoup plus grand pour les systèmes d'écriture asiatiques tels que l'hindi, le thaï, le chinois, le japonais et le coréen.

Utilisation privilégiée . UTF-8 est généralement le codage préféré pour HTML et les protocoles similaires, notamment sur Internet. La transparence ASCII facilite la migration. UTF-8 a également l'avantage d'être sérialisé en octets de manière native, comme la plupart des jeux de caractères 8 bits existants ; les chaînes d'UTF-8 fonctionnent facilement avec la bibliothèque standard C, et de nombreuses API existantes pour les jeux de caractères multi-octets typiques d'Asie de l'Est peuvent également être adaptées. en UTF-8 avec peu de changements.

Auto-synchronisé . Dans les environnements où le traitement des caractères 8 bits est requis pour une raison quelconque, UTF-8 présente les propriétés attrayantes suivantes par rapport aux autres codages multi-octets :

  • Le premier octet d'une séquence d'unités de code UTF-8 représente le nombre d'octets suivant la séquence multi-octets. Cela permet une analyse directe très efficace.
  • Il est possible de trouver le début d'un caractère commençant n'importe où dans le flux d'octets UTF-8. Le programme doit effectuer une recherche en arrière d'au plus quatre octets, généralement beaucoup moins. L'identification de l'octet initial est une tâche simple car l'octet initial est limité à une plage fixe de valeurs.
  • Comme pour les autres formes de codage, il n’y a pas de chevauchement dans les valeurs d’octets.

Tri binaire . Le tri binaire des chaînes UTF-8 donne le même ordre que le tri binaire des points de code Unicode. C'est évidemment le même ordre que le tri binaire des chaînes UTF-32.

Je suppose que tu aimes

Origine blog.csdn.net/booynal/article/details/127169730
conseillé
Classement