7
votes

Pourquoi UTF-8 utilise-t-il plus d'un octet pour représenter certains caractères?

J'ai récemment parcouru un article sur le codage du personnage . Je suis une préoccupation sur un certain point mentionné là-bas.

Dans la première figure, l'auteur affiche les caractères, leurs points de code dans divers ensembles de caractères et la manière dont ils sont codés dans divers formats de codage. Par exemple, le point de code de é est E9 . Dans ISO-8859-1 Encodage, il est représenté comme E9 . Dans utf-16 il est représenté comme 00 E9 . Mais dans utf-8 il est représenté à l'aide de 2 octets, C3 A9 .

Ma question est pourquoi est-ce requis? Il peut être représenté avec 1 octet. Pourquoi deux octets sont-ils utilisés? Pouvez-vous s'il vous plaît laissez-moi savoir?


0 commentaires

3 Réponses :


15
votes

utf-8 utilise les 2 bits élevés (bit 6 et bit 7) à Indiquez s'il y a plus d'octets: seuls les bits inférieurs 6 sont utilisés pour les données de caractère réelles. Cela signifie que n'importe quel caractère sur 7f nécessite (au moins) 2 octets.


3 commentaires

pour CODEPOINTS SOUS \ X80, les dernières données de caractères sept . Pour les octets de continuation, 6 bits sont utilisés. Pour les principaux octets d'un codage multibyte, 5 ou 4 bits sont utilisés.


Merci Bohemian. Cela clarifie ma requête.


Le génie de l'UTF-8, est qu'en examinant les deux bits élevés, vous pouvez déterminer si vous êtes au début ou au milieu d'un personnage. Il s'agissait d'un problème qui a fait preuve d'une tentative antérieure à des ensembles de caractères «larges»; Lorsque vous êtes sous-traitant au milieu d'une chaîne, vous ne saviez pas si l'octet était le début ou le milieu d'un personnage, ou où le codage «décalage vers large» / «décalage» était en place, quel était le dernier caractère de quart.



-4
votes

Parce que beaucoup de langues, il codant 2 bits qui ne suffit tout simplement pas pour coder toutes les lettres de tous les alphabets Voir 2 bits coding 00 .. FF 15 ^ 2 = 255 caractères 4 bits 0000 ... FFFF 4 ^ 15 = 50625


0 commentaires

14
votes

Un seul octet peut contenir une seule des 256 valeurs différentes.

Cela signifie qu'un encodage qui représente chaque caractère sous forme d'octet unique, tel que ISO-8859-1, ne peut pas encoder plus de 256 caractères différents. C'est pourquoi vous ne pouvez pas utiliser ISO-8859-1 pour écrire correctement l'arabe, le japonais ou dans de nombreuses autres langues. Il n'y a qu'une quantité limitée d'espace disponible, et elle est déjà utilisée par d'autres caractères.

utf-8, d'autre part, doit être capable de représenter toutes les millions de caractères à Unicode. Cela rend impossible d'appuyer tous les caractères en un seul octet.

Les concepteurs de UTF-8 ont choisi de créer tous les caractères ASCII (U + 0000 à U + 007F) représentant avec un octet unique et nécessitaient tous les autres caractères à stocker sous deux octets ou plus. S'ils avaient choisi de donner plus de caractères une représentation monte-octet, les codages d'autres caractères auraient été plus longs et plus compliqués.

Si vous voulez une explication visuelle de pourquoi les octets ci-dessus 7f ne représentent pas les caractères 8859-1 correspondants, regardez le table de codage UTF-8 sur Wikipedia . Vous verrez que chaque valeur d'octets en dehors de la gamme ASCII a déjà une signification ou est illégale pour des raisons historiques. Il n'ya tout simplement pas de place dans la table des octets pour représenter leurs équivalents de 8859-1 et donner aux octets signifient que les significations supplémentaires enfreignaient plusieurs propriétés importantes de UF-8.


3 commentaires

Bonne réponse claire et quantitative. Vous ne pouvez pas représenter un million de caractères dans un octet.


Je comprends que seules 2 ^ 8 valeurs peuvent être représentées en utilisant 8 bits. Ma question concernait le codage du point de code "E9". Pour représenter ces 8 bits suffisent. Dans UTF-16, il est 00E9. Où comme dans UTF-8, c'est C3A9. Pourquoi ne peuvent-ils pas simplement utiliser E9?


UTF-8 utilise déjà les octets commençant par E pour représenter le début d'une séquence de trois octets. Par exemple, le point de code U + 9A69 (驩) est codé comme E9 A9 A9 . Si E9 a été utilisé pour représenter u + 00e9 cela ne fonctionnerait pas, et il faudrait désigner complètement le codage de manière différente.