Pourquoi les caractères anglais nécessitent-ils moins d'octets pour représenter que les autres alphabets?

31

Quand je mets 'a' dans un fichier texte, ça fait 2 octets mais quand je mets, disons 'ա', qui est une lettre de l'alphabet arménien, ça fait 3 octets.

Quelle est la différence entre les alphabets pour un ordinateur?
Pourquoi l'anglais prend-il moins de place?

khajvah
la source
22
Vous devriez lire cet article du fondateur de StackExchange: joelonsoftware.com/articles/Unicode.html
Eric Lippert
22
Je ne pense pas qu'il existe une telle chose comme "les caractères anglais". Ils sont romains.
Raphael
5
@Raphael tout le monde sait de quoi il parle. Mais bon ajout.
Mathias Lykkegaard Lorenzen
1
@Raphael En fait, il existe de nombreuses lettres romaines qui ne sont pas utilisées en anglais et ne sont donc pas incluses dans le jeu de caractères ASCII. La plupart d'entre eux incluent des modificateurs, mais ceux-ci sont encore nécessaires pour rendre correctement le texte dans diverses langues dérivées du latin autres que l'anglais.
Wutaz
7
@Raphael Je ne pense pas qu'il y ait une telle chose comme «caractères romains». Ils sont latins.
Blacklight Shining

Réponses:

41

L'un des premiers schémas de codage à développer pour être utilisé dans les ordinateurs traditionnels est la norme ASCII ( American Standard Code for Information Interchange ). Il a été développé dans les années 1960 aux États-Unis.

L'alphabet anglais utilise une partie de l'alphabet latin (par exemple, il y a peu de mots accentués en anglais). Il y a 26 lettres individuelles dans cet alphabet, sans tenir compte du cas. Et il faudrait également qu'il existe des chiffres et des signes de ponctuation individuels dans tout schéma prétendant coder l'alphabet anglais.

Les années 60 ont également été une époque où les ordinateurs n'avaient pas la quantité de mémoire ou d'espace disque dont nous disposons actuellement. ASCII a été développé pour être une représentation standard d'un alphabet fonctionnel sur tous les ordinateurs américains. À l'époque, la décision de faire en sorte que chaque caractère ASCII soit de 8 bits (1 octet) a été prise en raison des détails techniques de l'époque (l'article de Wikipédia mentionne le fait que le ruban perforé contenait 8 bits à la fois). En fait, le schéma ASCII d'origine peut être transmis en utilisant 7 bits, les huit pourraient être utilisés pour les contrôles de parité. Les développements ultérieurs ont élargi le schéma ASCII d'origine pour inclure plusieurs caractères accentués, mathématiques et terminaux.

Avec l'augmentation récente de l'utilisation des ordinateurs à travers le monde, de plus en plus de personnes de langues différentes ont accès à un ordinateur. Cela signifiait que, pour chaque langue, de nouveaux schémas de codage devaient être développés, indépendamment des autres schémas, qui entreraient en conflit s'ils étaient lus à partir de terminaux de langue différents.

Unicode est venu comme une solution à l'existence de différents terminaux, en fusionnant tous les caractères significatifs possibles dans un seul jeu de caractères abstrait.

UTF-8 est une façon d'encoder le jeu de caractères Unicode. Il s'agit d'un codage à largeur variable (par exemple, différents caractères peuvent avoir des tailles différentes) et il a été conçu pour une compatibilité descendante avec l'ancien schéma ASCII. En tant que tel, le jeu de caractères ASCII restera gros d'un octet tandis que tous les autres caractères feront deux octets ou plus. UTF-16 est une autre façon d'encoder le jeu de caractères Unicode. Par rapport à UTF-8, les caractères sont codés sous la forme d'un ensemble d'une ou deux unités de code 16 bits.

Comme indiqué dans les commentaires, le caractère «a» occupe un seul octet tandis que «ա» occupe deux octets, ce qui dénote un codage UTF-8. L'octet supplémentaire dans votre question était dû à l'existence d'un caractère de nouvelle ligne à la fin (que l'OP a découvert).

Doktoro Reichard
la source
26
Il n'y a pas de dernier octet qui code la fin du fichier, dans n'importe quel format de codage ou de fichier normal. Lorsqu'un programme lit un fichier, la fin du fichier peut être signalée par le système d'exploitation d'une manière spéciale, mais c'est un problème différent.
Jukka K. Korpela
2
Le caractère is est de 2 octets (0xD5A1) dans la version UTF-8 d'unicode; le caractère supplémentaire (quel qu'il soit) est présent dans les deux fichiers. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Neely
6
@khajvah Si vous echo 'ա' > file.txtle faites , ou éditez le fichier à l'aide de certains éditeurs, ils ajoutent automatiquement une nouvelle ligne après. Si vous exécutez xxd file.txt, le dernier octet sera probablement un 0aou un saut de ligne.
Daniel Beck
7
@DoktoroReichard: Veuillez préciser dans la réponse qu'Unicode n'est pas un encodage; c'est plutôt un jeu de caractères abstrait, et UTF-16 et UTF-8 sont des encodages de points de code Unicode. Les derniers paragraphes de votre réponse parlent principalement d'UTF-8. Mais si un fichier utilise UTF-16, tout point de code, même celui pour a, utilisera deux octets (ou un multiple de deux).
grawity
6
Il convient également de souligner que les jeux de caractères "ASCII étendus" ne sont en fait pas du tout ASCII, et le nombre de façons différentes d'utiliser le huitième bit en fait un gros gâchis. Utilisez simplement UTF-8 à la place.
ntoskrnl
17

1 octet est 8 bits et peut ainsi représenter jusqu'à 256 (2 ^ 8) valeurs différentes.

Pour les langues qui nécessitent plus de possibilités que cela, un mappage simple de 1 à 1 ne peut pas être conservé, donc plus de données sont nécessaires pour stocker un caractère.

Notez que généralement, la plupart des encodages utilisent les 7 premiers bits (128 valeurs) pour les caractères ASCII . Cela laisse le 8e bit, soit 128 valeurs supplémentaires pour plus de caractères. . . ajoutez des caractères accentués, des langues asiatiques, cyrillique, etc., et vous comprendrez facilement pourquoi 1 octet n'est pas suffisant pour conserver tous les caractères.

ernie
la source
voici donc la seule réponse expliquant réellement pourquoi plus d'espace est utilisé
Félix Gagnon-Grenier
10

En UTF-8, les caractères ASCII utilisent un octet, les autres caractères utilisent deux, trois ou quatre octets.

Jason
la source
1
Pouvez-vous expliquer pourquoi c'est le cas? noter deux méthodes de codage ne répond pas tout à fait à la question.
MaQleod
@MaQleod Unicode a été créé pour remplacer ASCII. Pour une compatibilité ascendante, les 128 premiers caractères sont identiques. Ces 128 caractères peuvent être exprimés avec un octet. Des octets supplémentaires sont ajoutés pour les caractères supplémentaires.
Jason
Je suis au courant, mais cela fait partie de la réponse à la question de savoir ce qui rend les caractères ASCII différents. Cela devrait être expliqué au PO.
MaQleod
@MaQleod On pourrait également dire que le consortium Unicode était principalement composé de sociétés américaines et était orienté vers les caractères de langue anglaise. Je pensais qu'une réponse simple était meilleure qu'une réponse subjective.
Jason
15
Pas "en Unicode", en UTF8 - qui n'est qu'un des nombreux encodages du jeu de caractères Unicode.
Sebastian Negraszus
3

La quantité d'octets requis pour un caractère (dont la question porte apparemment sur) dépend du codage des caractères. Si vous utilisez l'encodage ArmSCII, chaque lettre arménienne occupe un seul octet. Ce n'est pas un bon choix de nos jours, cependant.

Dans le codage de transfert UTF-8 pour Unicode, les caractères ont besoin d'un nombre d'octets différent. Dans ce document, "a" ne prend qu'un octet (l'idée de deux octets est une sorte de confusion), "á" prend deux octets, et la lettre arménienne ayb "ա" prend également deux octets. Trois octets doivent être une sorte de confusion. En revanche, par exemple la lettre bengali un «“ »prend trois octets en UTF-8.

L'arrière-plan est simplement que UTF-8 a été conçu pour être très efficace pour les caractères Ascii, assez efficace pour les systèmes d'écriture en Europe et dans les environs, et tout le reste est moins efficace. Cela signifie que les lettres latines de base (qui sont principalement constituées de texte anglais), un seul octet est nécessaire pour un caractère; pour le grec, le cyrillique, l'arménien et quelques autres, deux octets sont nécessaires; tout le reste a besoin de plus.

UTF-8 a (comme souligné dans un commentaire) également la propriété utile que les données Ascii (lorsqu'elles sont représentées sous forme d'unités de 8 bits, ce qui était presque le seul moyen depuis longtemps) sont également codées UTF-8 de manière triviale.

Jukka K. Korpela
la source
Merci pour la réponse. Les octets supplémentaires sont dus au fait que le programme que j'ai utilisé a automatiquement ajouté un nouveau caractère de ligne à la fin.
khajvah
1
Je ne pense pas que l'UTF-8 ait été tant conçu pour l' efficacité avec les données ASCII que pour la compatibilité . UTF-8 a la très belle propriété que le contenu ASCII 7 bits (avec le bit haut réglé à zéro) est identique au même contenu codé que UTF-8, donc pour les outils qui traitent normalement avec ASCII, c'est un remplacement direct. . Aucun autre schéma de codage Unicode n'a cette propriété, à ma connaissance. L'UTF-8 est également raisonnablement compact pour la plupart des données, en particulier si vous restez dans le domaine du BMP Unicode .
un CVn du
1
@ MichaelKjörling, j'ai ajouté une référence à cette fonctionnalité. Cependant, une objection majeure à Unicode au début était l'inefficacité, et UTF-16 double la taille des données qui sont principalement Ascii. UTF-8 signifie, par exemple pour le texte anglais, que vous ne «payez» que pour les caractères non-ascii que vous utilisez.
Jukka K. Korpela
3

Les codes de caractères dans les années 1960 (et bien au-delà) étaient spécifiques à la machine. Dans les années 1980, j'ai brièvement utilisé une machine DEC 2020, qui avait des mots de 36 bits et des encodages de 5, 6 et 8 ( IIRC ) par caractère. Avant cela, j'ai utilisé une série IBM 370 avec EBCDIC. L'ASCII avec 7 bits a mis de l'ordre, mais il y a eu un désordre avec les «pages de codes» IBM PC utilisant les 8 bits pour représenter des caractères supplémentaires, comme toutes sortes de dessins de boîte pour peindre des menus primitifs, et des extensions ASCII ultérieures comme Latin-1 (8 bits encodages, avec les 7 premiers bits comme ASCII et l'autre moitié pour les "caractères nationaux" comme ñ, Çou autres. Probablement le plus populaire était le latin-1, adapté à l'anglais et à la plupart des langues européennes utilisant des caractères latins (et des accents et des variantes).

L'écriture de texte mélangeant par exemple l'anglais et l'espagnol s'est bien passée (utilisez simplement le latin-1, surensemble des deux), mais mélanger tout ce qui utilisait un encodage différent (disons inclure un extrait de grec ou de russe, sans parler d'une langue asiatique comme le japonais) était un véritable cauchemar. Le pire était que le russe et en particulier le japonais et le chinois avaient plusieurs encodages populaires, complètement incompatibles.

Aujourd'hui, nous utilisons Unicode, qui est couplé à des encodages efficaces comme UTF-8 qui favorisent les caractères anglais (étonnamment, l'encodage des lettres anglais correspond justement à ASCII), ce qui fait que de nombreux caractères non anglais utilisent des encodages plus longs.

vonbrand
la source
2

Windows 8.1 US / English File avec un seul «a» enregistré avec le bloc-notes.

  • Enregistrer en tant qu'ANSI 1 octet
  • Enregistrer AS Unicode 4 octets
  • Enregistrer AS UTF-8 4 octets

Fichier avec un seul «ա» enregistré avec le bloc-notes

  • Enregistrement AS ANSI impossible
  • Enregistrer AS Unicode 4 octets
  • Enregistrer sous UTF-8 5 octets

Un seul «a» est codé comme un seul octet en ANSI, en Unicode, chaque caractère est généralement de 2 octets, il y a aussi une nomenclature de 2 octets (Byte Order Marker) au début du fichier. UTF-8 a une nomenclature à 3 octets et le caractère à un octet.

Pour le «ա», ce caractère n'existe pas dans le jeu de caractères ANSI et ne peut pas être enregistré sur ma machine. Le fichier Unicode est le même qu'avant, et le fichier UTF-8 est 1 octet plus grand car le caractère prend 2 octets.

Si votre machine est d'une région différente, vous pouvez avoir une page de codes OEM différente qui a différents glyphes pour les 255 caractères possibles dans la plage ASCII. Comme @ntoskrnl l'a mentionné, la page de codes OEM pour ma machine serait Windows-1252, qui est la valeur par défaut pour l'anglais américain.

Darryl Braaten
la source
4
Le Bloc-notes (et Windows en général) utilise ici une terminologie déroutante. "ANSI" est un codage à un octet dépendant des paramètres régionaux (Windows-1252 sur les versions anglaises) et "Unicode" est UTF-16.
ntoskrnl
@ntoskrnl C'est exact, mais si vous cherchez dans l'encadré pour l'encodage, il dit ANSI, c'est pourquoi j'ai mentionné que si vous avez une page de code OEM différente, vous pouvez obtenir des résultats différents.
Darryl Braaten
2

Si vous êtes intéressé par la façon dont les caractères sont stockés, vous pouvez aller sur www.unicode.org et regarder autour de vous. En haut de leur page principale se trouve un lien "Graphiques" qui vous montre tous les codes de caractères disponibles dans Unicode.

Au total, un peu plus d'un million de codes sont disponibles en Unicode (tous ne sont pas utilisés). Un octet peut contenir 256 valeurs différentes, vous aurez donc besoin de trois octets si vous souhaitez stocker tous les codes Unicode possibles.

Au lieu de cela, Unicode est généralement stocké dans le codage "UTF-8" qui utilise moins d'octets pour certains caractères et plus pour d'autres. Les 128 premières valeurs de code sont stockées dans un seul octet, jusqu'aux 2048 premières valeurs de code sont stockées dans deux octets, jusqu'à 65536 sont stockées dans trois octets et les autres prennent quatre octets. Cela a été organisé de sorte que les valeurs de code qui sont utilisées le plus souvent prennent moins de place. AZ, az, 0-9 et! @ $% ^ & * () - [} {}; ': "|,. / <>? Et certains que j'ai oublié prennent un octet; presque tout l'anglais, 98% de L'allemand et le français (juste deviner) peuvent être stockés dans un octet par caractère, et ce sont les caractères les plus utilisés. Le cyrillique, le grec, l'hébreu, l'arabe et certains autres utilisent deux octets par caractère. Les langues indiennes, la plupart du chinois, du japonais , Coréen, thaï, des tonnes de symboles mathématiques, peut être écrit en trois octets par caractère. Les choses rares (si jamais vous voulez écrire du texte en linéaire A ou linéaire B, Emojis) prennent quatre octets.

Un autre codage est UTF-16. Tout ce qui prend 1, 2 ou 3 octets en UTF-8 prend deux octets en UTF-16. C'est un avantage si vous avez du texte chinois ou japonais avec très peu de caractères latins entre les deux.

À propos des raisons de la conception UTF-8: il présente plusieurs avantages par rapport aux autres conceptions. Elles sont:

Compatibilité avec les caractères US-ASCII

Compacité raisonnable

Auto-synchronisation: cela signifie que si vous disposez d'une partie d'une séquence d'octets qui sont des caractères dans le codage UTF-8, vous pouvez savoir où commence le caractère. Dans certains encodages, xy et yx peuvent être des encodages valides de caractères, donc si on vous donne une partie d'une séquence ... xyxyxyxyxyxy ... vous ne pouvez pas savoir quels caractères vous avez.

Exactitude du tri: Si vous triez des chaînes contenant des caractères codés UTF-8 par leurs valeurs d'octet, elles sont automatiquement triées correctement en fonction de leurs valeurs Unicode.

Compatible avec le code à un octet: La plupart du code qui suppose des valeurs à un octet fonctionne automatiquement correctement avec les caractères codés UTF-8.

Plus les raisons que j'ai oubliées.

gnasher729
la source