web-dev-qa-db-fra.com

Comment fonctionne le "codage à largeur variable" UTF-8?

Le standard unicode contient suffisamment de points de code pour que vous ayez besoin de 4 octets pour les stocker tous. C'est ce que fait l'encodage UTF-32. Pourtant, le codage UTF-8 les presse en quelque sorte dans des espaces beaucoup plus petits en utilisant quelque chose appelé "codage à largeur variable".

En fait, il parvient à représenter les 127 premiers caractères de US-ASCII dans un seul octet qui ressemble exactement à du vrai ASCII, vous pouvez donc interpréter beaucoup de texte ascii comme s'il s'agissait d'UTF-8 sans rien y faire. Astuce. Alors, comment ça marche?

Je vais poser et répondre à ma propre question ici parce que je viens de lire un peu pour le comprendre et je pensais que cela pourrait faire gagner du temps à quelqu'un d'autre. De plus, quelqu'un peut peut-être me corriger si je me trompe.

98
dsimard

Chaque octet commence par quelques bits qui vous indiquent s'il s'agit d'un point de code à un octet, d'un point de code à plusieurs octets ou de la continuation d'un point de code à plusieurs octets. Comme ça:

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

Les points de code multi-octets commencent chacun par quelques bits qui disent essentiellement "hé, vous devez également lire l'octet suivant (ou deux ou trois) pour comprendre ce que je suis." Elles sont:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

Enfin, les octets qui suivent ces codes de démarrage ressemblent tous à ceci:

10xx xxxx    A continuation of one of the multi-byte characters

Puisque vous pouvez dire quel type d'octet vous regardez à partir des premiers bits, alors même si quelque chose est altéré quelque part, vous ne perdez pas la séquence entière.

118
dsimard

RFC3629 - UTF-8, un format de transformation ISO 10646 est l'autorité finale ici et a toutes les explications.

En bref, plusieurs bits dans chaque octet de la séquence de 1 à 4 octets codée en UTF-8 représentant un seul caractère sont utilisés pour indiquer s'il s'agit d'un octet de fin, d'un octet de tête et, dans l'affirmative, combien d'octets suivent. Les bits restants contiennent la charge utile.

8
azheglov

UTF-8 était un autre système pour stocker votre chaîne de points de code Unicode, ces nombres U + magiques, en mémoire en utilisant des octets de 8 bits. En UTF-8, chaque point de code de 0 à 127 est stocké dans un seul octet. Seuls les points de code 128 et supérieurs sont stockés en utilisant 2, 3, en fait, jusqu'à 6 octets.

Extrait de Le minimum absolu Chaque développeur de logiciels doit absolument, positivement, connaître Unicode et les jeux de caractères (pas d'excuses!)

3
Andrew