Top Qs
Chronologie
Chat
Contexte

UTF-16

format de transformation des textes codés avec une ou deux unités de code à 16 bits par caractère du jeu de caractères universel défini par la norme ISO/CEI 10646 et le Standard Unicode De Wikipédia, l'encyclopédie libre

Remove ads

Unicode fournit la page Terminologie Unicode français – anglais utilisée dans cet article.

 

UTF-16 ((16-bit Unicode Transformation Format) est un encodage de longueur variable qui permet de coder les 1 112 064 valeurs de code valides des normes Unicode et ISO/IEC 10646 . Les valeurs de code du plan multilingue de base (abréviation : PMB) sont codées sur un codet de 16 bits appelé seizet. Les valeurs de code des plans multilingues complémentaires sont codées sur une paire de seizets d'indirection : le seizet d'indirection supérieur (de 0xD800 à 0xDBFF) et le seizet d'indirection inférieur (de 0xDC00 à 0xDFFF)[1].

UTF-16 fait partie intégrante de la norme Unicode, dans son chapitre 3 Conformance[2], qui le définit de façon très stricte. Il utilise un jeu de caractères commun avec la norme ISO 10646. URF-16 prend en charge les 1 112 064 points de code Unicode valides.

Remove ads

Historique

UTF-16 est issu d'un ancien codage 16 bits à largeur fixe, désormais obsolète, connu sous le nom d'UCS-2[3] (pour Universal Character Set sur 2 octets). UCS-2 est à l’origine de développements majeurs tels que Windows, IOS,Java ou Qt. Avec l’ajout des emojis et de caractères CJK importants, comme les noms de personnes et les noms de lieux, il est devenu évident qu’un codage sur 16 bits ne suffirait pas. UTF-16 est conçu comme une extension d’UCS-2, de façon à préserver l’existant.

La longueur variable de l'UTF-16, combinée au fait que la plupart des caractères ne sont pas de longueur variable (de sorte que la longueur variable est rarement testée), a entraîné de nombreux bugs logiciels. Plusieurs implémentations se limitent aux caractères codés sur un seul seizet, ou traitent la longueur variable de manière incomplète.

Remove ads

Usage

Contrairement à UTF-8, UTF-16 n’est pas compatible avec le code ASCII. Il n'a jamais gagné en popularité sur le Web, où il est déclaré par moins de 0,004 % des pages web publiques. UTF-8, en comparaison, domine l'encodage depuis des années et représente 99 % de toutes les pages web en 2025[4].

UTF-16 est plus compact que UTF-8 pour les textes avec les caractères asiatiques du plan Mmltilingue de basee. (PMB) Les caractères CJK sont codés sur deux octets au lieu de 3 en UTF-8.

Remove ads

Description

Résumé
Contexte

Chaque point de code Unicode est codé en une ou deux unités de 16 bits appelés seizet.

Les points de code inférieurs à 216 dans le PMB») sont codés avec un seul seizet dont la valeur est égale à la valeur numérique du point de code, comme dans ancien UCS-2.

Les points de code supérieurs ou égaux à 216 au-dessus du PMB») sont codés avec deux sezets. Ces deux seizets sont choisis dans la plage de d’indirection UTF-16  de 0xD800 à 0xDFFF. Les valeurs de cette plage ne sont jamais utilisées comme caractères, et UTF-16 ne permet pas de les coder comme points de code individuels. Un flux UTF-16 est donc constitué de seizets du PMB en dehors de la plage d’indirection et de paires de seizets d’indirection judicieusement choisies dans la plage d’indirection.

Points de code du plan multilingue de base (PMB)

Il s’agit des points de code de U+0000 à U+D7ff et de U+E000 à U+FFFF.

UTF-16 et UCS-2 codent les points de code de cette plage sous forme d'unités de code uniques de 16 bits appelés seizets, numériquement égales aux points de code correspondants.

Depuis Unicode 9.0, certaines écritures modernes non latines d'Asie, du Moyen-Orient et d'Afrique se situent en dehors de cette plage, tout comme la plupart des caractères emoji.

Points de code des 16 plans multilingues supplémentaires

Ce sont les points de code de U+01000 à U+10FFFF.

Ils sont codés sous forme de deux unités de code de 16 bits appelées seizets de d’indirection. La première unité de code est le sezet  d’indirection supérieur (High-Surrogate Code Unit) et la seconde unité de code est le seizet d’indirection inférieur  (Low-Surrogate Code Unit).

La valeur 0x10000 est soustraite du point de code (U), il reste une valeur sur 20 bits (U') comprise entre 0x00000 et 0xFFFFF.

Les dix bits de poids fort (compris entre 0x000 et 0x3FF) sont ajoutés à 0xD800 pour obtenir le sezet d’indirection supérieur (W1), compris entre 0xD800 et 0xDBFF.

Les dix bits de poids faible (également compris entre 0x000 et 0x3FF) sont ajoutés à 0xDC00 pour obtenir le seizet d’indirection inférieur (W2), compris entre 0xDC00 et 0xDFFF.

Exemple

Thumb
Exemple de codage utf-16 pout le point de code SazuropodeU+01F995

Auto synchronisation

Étant donné que les plages des substituts supérieurs (0xD800–0xDBFF), des substituts inférieurs (0xDC00–0xDFFF) et des caractères PMB valides (0x0000–0xD7FF, 0xE000–0xFFFF) sont disjointes, il est impossible qu'un seizet d'indirection corresponde à un caractère PMB ou que deux unités de code adjacentes ressemblent à une paire de substituts valide. Cela simplifie considérablement les recherches. Cela signifie également que l'UTF-16 s'auto-synchronise sur les seizets : il est possible de déterminer si une unité de code commence un caractère sans examiner les unités de code précédentes (c'est-à-dire que le type d'unité de code peut être déterminé par les plages de valeurs dans lesquelles elle se situe). L'UTF-8 partage ces avantages, mais de nombreux schémas de codage multi-octets antérieurs (tels que Shift-JIS et autres codages multi-octets asiatiques) ne permettaient pas une recherche univoque et ne pouvaient être synchronisés qu'en analysant la chaîne depuis le début. Toutefois, UTF-16 ne s'autosynchronise pas si un octet est perdu.

Ordre des octets

Il y a deux façons de représenter un seizet avec deux octets :

  • Gros boutisme (big-endian en anglais) : Les 8 bits de poids  fort du seizet sont dans le premier octet et les 8 bits de poids faible du seizet sont dans le second octet.
  • Petit boutisme (little-endian en anglais): Les 8 bits de poids faible du seizet sont dans le premier octet et les 8 bits de poids faible du seizet sont dans  le second octet.

L’ordre des octets est donc important quand il s’agit des entrées-sorties. Pour faciliter la reconnaissance du mode utilisé, la norme définit le caractère U+FEFF nommé « indicateur d'ordre des octets » (BOM en anglais) à placer optionnellement au début d’un texte encodé en UTF-16. Il est aussi possible de spécifier directement l’encodage utilisé : avec l'étiquette UTF-16BE pour indiquer du texte UTF-16 big-endian et l'étiquette UTF-16LE pour indiquer du texte UTF-16 little-endian[5].

Remove ads

Notes et références

Voir aussi

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads