web-dev-qa-db-fra.com

Comment le codage UTF-8 identifie-t-il les caractères à un octet et à deux octets?

Récemment, j'ai rencontré un problème concernant le codage de caractères, alors que je creusais dans le jeu de caractères et le codage de caractères, ce doute m'est venu à l'esprit.Le codageUTF-8 est le plus populaire en raison de sa compatibilité ascendante avec ASCII.Comme l'UTF-8 est de longueur variable format de codage, comment il différencie les caractères à un octet et à deux octets. Par exemple, "A ݔ" est stocké sous la forme "410754" (Unicode pour A est 41 et Unicode pour le caractère arabe est 0754.Comment le codage identifie 41 est un caractère et 0754 est un autre Pourquoi n'est-il pas considéré comme 4107 comme un caractère à deux octets et 54 comme un caractère à un octet?

16
Ganesh kumar S R

Par exemple, "A ݔ" est stocké sous le nom "410754"

Ce n'est pas ainsi que fonctionne l'UTF-8.

Les caractères U + 0000 à U + 007F (aka ASCII) sont stockés sous forme d'octets uniques. Ce sont les seuls caractères dont les points de code correspondent numériquement à leur présentation UTF-8. Par exemple, U + 0041 devient 0x41 lequel est 0100001 en binaire.

Tous les autres caractères sont représentés avec plusieurs octets. U + 0080 à U + 07FF utilisent deux octets chacun, U + 0800 à U + FFFF utilisent trois octets chacun, et U + 10000 à U + 10FFFF utilisent quatre octets chacun.

Les ordinateurs savent où se termine un caractère et où commence le suivant car UTF-8 a été conçu pour que les valeurs à un octet utilisées pour ASCII ne se chevauchent pas avec celles utilisées dans les séquences à plusieurs octets. Les octets 0x00 par 0x7F ne sont utilisés que pour ASCII et rien d'autre; les octets ci-dessus 0x7F ne sont utilisés que pour les séquences multi-octets et rien d'autre. De plus, les octets qui sont utilisés au début des séquences multi-octets ne peuvent pas non plus apparaître dans aucune autre position dans ces séquences.

Pour cette raison, les points de code doivent être codés. Considérez les modèles binaires suivants:

  • 2 octets: 110xxxxx 10xxxxxx
  • 3 octets: 1110xxxx 10xxxxxx 10xxxxxx
  • 4 octets: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Le nombre de uns dans le premier octet vous indique combien des octets suivants appartiennent toujours au même caractère. Tous les octets appartenant à la séquence commencent par 10 en binaire. Pour encoder le caractère, vous convertissez son point de code en binaire et remplissez les x.

Par exemple: U + 0754 se situe entre U + 0080 et U + 07FF, il a donc besoin de deux octets. 0x0754 en binaire est 11101010100, vous remplacez donc les x par ces chiffres:

110 11101 10 101

27
CharlotteBuff

Réponse courte:

UTF-8 est conçu pour pouvoir sans ambiguïté identifier le type de chaque octet dans un flux de texte:

  • Codes à 1 octet (tous et seulement les ASCII caractères) commencent par un 0
  • Les premiers octets des codes à 2 octets commencent par deux 1 suivis d'un 0 (c'est-à-dire 110 )
  • Les premiers octets des codes à 3 octets commencent par trois 1 suivis d'un 0 (c'est-à-dire 1110 )
  • Les premiers octets des codes à 4 octets commencent par quatre 1 suivis d'un 0 (c.-à-d. 11110 )
  • Octets de continuation (de tous les codes multi-octets) commencent par un seul 1 suivi d'un 0 (c'est-à-dire 10 )

Votre exemple , qui se compose des points de code Unicode U + 0041 et U + 0754, est codé en UTF-8 comme:

0 1000001 110 11101 10 010100

Ainsi, lors du décodage, UTF-8 sait que le premier octet doit être un code à 1 octet, le deuxième octet doit être l'octet de tête d'un code à 2 octets, le troisième octet doit être un octet de continuation, et depuis le deuxième octet est l'octet de tête d'un code 2 octets, les deuxième et troisième octets doivent former ensemble ce code à 2 octets.


Voir ici comment UTF-8 code les points de code Unicode.

15
weibeld

Juste pour clarifier, ASCII signifie standard 7 bits ASCII et non étendu 8 bits ASCII comme couramment utilisé en Europe) .

Ainsi, une partie du premier octet (0x80 à 0xFF) passe à la représentation sur deux octets et une partie du deuxième octet sur deux octets (0x0800 à 0xFFFF) prend la représentation complète sur trois octets.

La représentation à quatre octets utilise uniquement les trois octets les plus bas et seulement 1.114.111 des 16.777.215 possibilités disponibles

Vous avez un xls ici

Cela signifie que les interprètes doivent "reculer" d'un octet NUL (0) lorsqu'ils trouvent ces modèles binaires.

J'espère que cela aide quelqu'un!

1
jmcollantes