web-dev-qa-db-fra.com

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

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

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

30
khajvah

Le ASCII ( code américain normalisé pour l'échange d'informations est l'un des premiers systèmes de codage à utiliser dans les ordinateurs classiques. )) la norme. 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 de la casse. Et il devrait également exister les numéros individuels et les signes de ponctuation dans tout schéma prétendant encoder l'alphabet anglais.

Les années 1960 étaient également une époque où les ordinateurs n’avaient pas la quantité de mémoire ou d’espace disque dont nous disposions maintenant. 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 ASCII caractère soit de 8 bits (1 octet) de long a été prise en raison de détails techniques sur le moment (l'article de Wikipedia mentionnait le fait qu'une bande perforée contenait 8 bits dans un fichier). position à la fois). En fait, le schéma original ASCII peut être transmis en utilisant 7 bits, le huitième pouvant être utilisé pour les contrôles de parité. Les développements ultérieurs ont étendu le schéma original ASCII pour inclure plusieurs caractères accentués, mathématiques et terminaux.

Avec la récente augmentation de l'utilisation des ordinateurs à travers le monde, de plus en plus de personnes de différentes langues 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.

nicode est une solution à l’existence de différents terminaux en fusionnant tous les caractères significatifs possibles dans un seul jeu de caractères abstrait.

TF-8 est un moyen de coder le jeu de caractères Unicode. Il s’agit d’un codage à largeur variable (par exemple, différents caractères peuvent avoir différentes tailles) et il a été conçu pour assurer une compatibilité ascendante avec le précédent schéma ASCII. En tant que tel, le jeu de caractères ASCII restera défini sur un octet, tandis que tous les autres caractères auront deux octets ou plus. UTF-16 est un autre moyen de coder le jeu de caractères Unicode. En comparaison avec UTF-8, les caractères sont codés sous forme d'un ensemble d'une ou de deux unités de code 16 bits.

Comme indiqué dans les commentaires, le caractère "a" occupe un seul octet tandis que "ա" en occupe deux, indiquant 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 le PO a découvert).

41
Doktoro Reichard

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

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

Notez qu'en général, la plupart des encodages utilisent les 7 premiers bits (128 valeurs) pour les caractères ASCII . Cela laisse le 8ème bit, ou 128 valeurs supplémentaires pour plus de caractères. . . Ajoutez des caractères accentués, des langues asiatiques, du cyrillique, etc., et vous comprendrez aisément pourquoi un octet n'est pas suffisant pour conserver tous les caractères.

17
ernie

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

10
Jason

Le nombre d'octets requis pour un caractère (qui concerne apparemment la question) dépend de l'encodage des caractères. Si vous utilisez le codage ArmSCII, chaque lettre arménienne n’occupe qu’un octet. Ce n’est pas un bon choix ces jours-ci, cependant.

Dans le codage de transfert UTF-8 pour Unicode, les caractères nécessitent un nombre d'octets différent. Dans celui-ci, "a" prend seulement 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 le reste est moins efficace. Cela signifie que les lettres latines de base (qui est le texte anglais principalement), un seul octet est nécessaire pour un caractère; pour le grec, le cyrillique, l'arménien et quelques autres, il faut deux octets; tout le reste a besoin de plus.

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

3
Jukka K. Korpela

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 comportait des mots de 36 bits et des codages de 5, 6 et 8 bits ( IIRC ) par caractère. Avant cela, j’utilisais une série IBM 370 avec EBCDIC. ASCII avec 7 bits mis en ordre, mais les problèmes avec les "pages de codes" d'IBM PC utilisent les 8 bits pour représenter des caractères supplémentaires, comme toutes sortes de boîtes de dessin dans les menus primitifs Paint, puis plus tard ASCII extensions comme Latin-1 (codages 8 bits, avec les 7 premiers bits tels que ASCII et l'autre moitié pour les "caractères nationaux" tels que ñ, Ç ou d'autres. Le plus populaire était probablement le latin -1, adapté à l'anglais et à la plupart des langues européennes en utilisant des caractères latins (et des accents et variantes).

Écrire un texte en mélangeant, par exemple L'anglais et l'espagnol se passaient bien (il suffisait d'utiliser Latin-1, super ensemble des deux), mais mélanger tout ce qui utilisait un codage différent (par exemple 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 les japonais et les chinois, possédaient plusieurs codages populaires, totalement incompatibles.

Aujourd'hui, nous utilisons Unicode, qui est associé à des codages efficaces tels que UTF-8 qui privilégient les caractères anglais (étonnamment, le codage pour les lettres anglais correspond tout à fait à ASCII), ce qui oblige de nombreux caractères non anglais à utiliser des codages plus longs.

3
vonbrand

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

Au total, il y a un peu plus d'un million de codes disponibles en Unicode (ils ne sont pas tous 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 davantage pour d'autres. Les 128 premières valeurs de code sont stockées dans un seul octet, jusqu'à la première des 2048 valeurs sont stockées dans deux octets, jusqu'à 65 536 sont stockées dans trois octets et les autres prennent quatre octets. Cela a été organisé de sorte que les valeurs de code utilisées plus souvent prennent moins d'espace. AZ, az, 0-9 et! @ $% ^ & * () - [} {}; ': "|,./<>? Et d’autres que j’ai oublié prendre un octet; presque tout l’anglais, 98% des L'allemand et le français (deviner juste) peuvent être stockés dans un octet par caractère, et ce sont les caractères les plus utilisés: cyrillique, grec, hébreu, arabe et quelques autres utilisent deux octets par caractère. Langues indiennes, la plupart en chinois et japonais , Coréen, thaï, des tonnes de symboles mathématiques peuvent être écrits en trois octets par caractère Les choses rares (si vous voulez un jour écrire du texte en Linéaire A ou Linéaire B, Emoji) prennent quatre octets.

Un autre encodage est UTF-16. Tout ce qui prend 1, 2 ou 3 octets dans UTF-8 prend deux octets dans 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: Elle présente plusieurs avantages par rapport à d’autres conceptions. Elles sont:

Compatibilité avec les caractères US-ASCII

Compacité raisonnable

Auto-synchronisation: Cela signifie que si vous recevez 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. Par conséquent, si vous recevez une partie d'une séquence ... xyxyxyxyxyxy ... vous ne pouvez pas savoir quels caractères vous avez.

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

Compatible avec le code à un octet: La plupart des codes reposant sur des valeurs à un octet fonctionnent automatiquement correctement avec les caractères codés UTF-8.

De plus, quelles que soient les raisons que j'ai oubliées.

2
gnasher729

Windows 8.1 US/English Fichier avec un seul "a" enregistré avec le bloc-notes.

  • Enregistrer AS ANSI 1 octet
  • Enregistrer AS Unicode 4 octets
  • Enregistrer AS UTF-8 4 octets

Fichier avec un seul '' enregistré avec le bloc-notes

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

Un seul "a" est codé sous la forme d'un seul octet dans ANSI. En Unicode, chaque caractère est généralement composé de 2 octets. Il existe également une BOM de 2 octets (marqueur d'ordre d'octet) au début du fichier. UTF-8 a une nomenclature à 3 octets et le caractère à octet unique.

Pour le caractère "", 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 que précédemment et le fichier UTF-8 est 1 octet plus grand, car le caractère prend 2 octets.

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

2
Darryl Braaten