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?
Réponses:
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).
la source
echo 'ա' > file.txt
le faites , ou éditez le fichier à l'aide de certains éditeurs, ils ajoutent automatiquement une nouvelle ligne après. Si vous exécutezxxd file.txt
, le dernier octet sera probablement un0a
ou un saut de ligne.a
, utilisera deux octets (ou un multiple de deux).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.
la source
En UTF-8, les caractères ASCII utilisent un octet, les autres caractères utilisent deux, trois ou quatre octets.
la source
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.
la source
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.
la source
Windows 8.1 US / English File avec un seul «a» enregistré avec le bloc-notes.
Fichier avec un seul «ա» enregistré avec le bloc-notes
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.
la source
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.
la source