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?
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:
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
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
Réponse courte:
UTF-8 est conçu pour pouvoir sans ambiguïté identifier le type de chaque octet dans un flux de texte:
Votre exemple Aݔ
, 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.
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!