
Si vous écrivez une application internationale qui utilise plusieurs langues, vous devez savoir une chose ou deux sur l'encodage. Elle est responsable de la façon dont le texte est affiché à l'écran. Je parlerai brièvement de l'histoire de l'encodage et de sa standardisation, puis nous parlerons de son utilisation. Parlons un peu de la théorie de l'informatique.
Introduction à l'encodage
Les ordinateurs ne comprennent que les nombres binaires - les zéros et les uns, c'est leur langage. Rien d'autre. Un nombre est appelé un octet, chaque octet est composé de huit bits. Autrement dit, huit zéros et un constituent un octet. À l'intérieur des ordinateurs, tout se résume au binaire - langages de programmation, mouvements de souris, frappes au clavier et tous les mots à l'écran. Mais si l'article que vous lisez était un tas de zéros et de uns, alors comment les nombres binaires sont-ils devenus du texte? Découvrons-le.
Une brève histoire de l'encodage
À l'aube de son développement, Internet était exclusivement anglophone. Ses auteurs et utilisateurs n'avaient pas à se soucier des caractères des autres langues, et tous les besoins étaient entièrement couverts par le codage ASCII (American Standard Code for Information Interchange).
ASCII est une table permettant de mapper des symboles binaires sur des caractères de l'alphabet. Lorsque l'ordinateur reçoit une entrée comme celle-ci:
01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
puis en utilisant ASCII, il le convertit en l'expression "Hello world".
Un octet (huit bits) était assez grand pour contenir n'importe quelle lettre en anglais, ainsi que des caractères de contrôle, dont certains étaient utilisés par les téléimprimeurs, donc à l'époque, ils étaient utiles (aujourd'hui, ils ne sont plus très utiles). Les caractères de contrôle étaient, par exemple, 7 (0111 en binaire), ce qui a amené l'ordinateur à émettre un signal; 8 (1000 en binaire) - affiche le dernier caractère imprimé; ou 12 (1100 en binaire) - efface tout le texte écrit sur le terminal vidéo.
À cette époque, les ordinateurs comptaient 8 bits par octet (ce n'était pas toujours le cas), donc il n'y avait pas de problème. Nous pourrions stocker tous les caractères de contrôle, tous les nombres et les lettres anglaises, et même il y avait encore de la place, car un octet peut encoder 255 caractères, et ASCII n'en a besoin que de 127. Autrement dit, il y avait encore 128 positions dans l'encodage inutilisées.
Voici à quoi ressemble une table ASCII. Les nombres binaires codent toutes les lettres majuscules et minuscules de A à Z et les nombres de 0 à 9. Les 32 premières positions sont réservées aux caractères de contrôle non imprimables.

Problèmes ASCII
Les positions 128 à 255 étaient vides. Le public s'est demandé comment les remplir. Mais ils avaient tous des idées différentes . L'American National Standards Institute (ANSI) formule des normes pour différentes industries. Ils ont approuvé les positions ASCII de 0 à 127. Personne ne les a contestées. Le problème était avec le reste des postes.
C'est ce qui a occupé les postes 128 à 255 dans les premiers ordinateurs IBM:

Quelques gribouillis, icônes d'arrière-plan, opérateurs mathématiques et symboles accentués comme é. Mais les développeurs d'autres architectures informatiques n'ont pas soutenu l'initiative. Tout le monde voulait implémenter son propre encodage dans la seconde moitié de l'ASCII.
Toutes ces différentes fins ont été appelées pages de codes .
Que sont les pages de codes ASCII?
Voici une collection de plus de 465 pages de codes différentes! Il y avait différentes pages même dans la même langue, par exemple pour le grec et le chinois. Comment ce désordre pourrait-il être normalisé? Ou du moins le faire fonctionner entre différentes langues? Ou entre différentes pages de codes pour la même langue? Dans des langues autres que l'anglais? Les Chinois ont plus de 100 000 caractères. L'ASCII ne peut même pas les accueillir tous, même s'ils ont décidé de donner toutes les positions vides pour les caractères chinois.
Ce problème s'appelait même Mojibake (bnop, krakozyabry). C'est ce qu'ils disent à propos du texte déformé, qui est obtenu lors de l'utilisation d'un encodage incorrect. Traduit du japonais, mojibake signifie "conversion de caractères".

Un exemple de bnopni (krakozyabrov).
Une sorte de folie ...
Exactement! Il n'y avait aucune chance de convertir les données de manière fiable. Internet n'est qu'une monstrueuse connexion d'ordinateurs du monde entier. Imaginez que tous les pays décident d'utiliser leurs propres normes. Par exemple, les ordinateurs grecs n'acceptent que le grec, tandis que les ordinateurs anglais n'envoient que l'anglais. C'est comme crier dans une grotte vide, personne ne peut vous entendre.
L'ASCII n'était plus adéquat pour la vie. Pour l'Internet mondial, il fallait créer quelque chose de différent, sinon il y aurait eu des centaines de pages de codes à gérer. Sauf si vous ne souhaitez pas lire ces paragraphes.
֎֏ 0590 ׀ׁׂ׃ׅׄ׆ׇ
C'est ainsi qu'est né Unicode
Unicode signifie Universal Coded Character Set (UCS) et porte la désignation officielle ISO / CEI 10646. Mais généralement, tout le monde utilise le nom Unicode.
Cette norme a aidé à résoudre les problèmes causés par l'encodage et les pages de codes. Il contient de nombreux points de code ( points de code) attribués à des caractères de langues et de cultures du monde entier. Autrement dit, Unicode est un ensemble de caractères . Il peut être utilisé pour associer une abstraction à la lettre à laquelle nous voulons faire référence. Et cela est fait pour chaque symbole, même les hiéroglyphes égyptiens .
Quelqu'un a fait un excellent travail en faisant correspondre chaque caractère dans toutes les langues avec des codes uniques. Voici à quoi ça ressemble:
«Hello World» U+0048 : H U+0065 : E U+006C : L U+006C : L U+006F : O U+0020 : U+0057 : W U+006F : O U+0072 : R U+006C : L U+0064 : D
Le préfixe U + indique qu'il s'agit d'un standard Unicode et que le nombre est une conversion binaire. La norme utilise la notation hexadécimale, qui est une représentation simplifiée des nombres binaires. Ici, vous pouvez entrer n'importe quoi dans le champ et voir comment il est converti en Unicode. Et ici, vous pouvez admirer les 143 859 points de code.
Je clarifierai juste au cas où: nous parlons d'un grand dictionnaire de points de code attribués à toutes sortes de symboles. C'est un très grand ensemble de symboles, rien de plus.
Il reste à ajouter le dernier ingrédient.
Unicode Transform Protocol (UTF)
UTF est un protocole d'encodage de points de code en Unicode. Il est précisé dans la norme et vous permet d'encoder n'importe quel point de code. Cependant, il existe différents types d'UTF. Ils diffèrent par le nombre d'octets utilisés pour encoder un élément. UTF-8 utilise un octet par point, UTF-16 utilise deux octets et UTF-32 utilise quatre octets.
Mais si nous avons trois encodages différents, comment savoir lequel est utilisé dans un fichier particulier? Pour cela, une marque d'ordre d'octet (BOM) est utilisée, également appelée signature d'encodage. BOM est un marqueur de deux octets au début du fichier qui vous indique quel codage est utilisé ici.
Sur Internet, UTF-8 est le plus couramment utilisé , il est également écrit comme préféré dans la norme HTML5, je vais donc lui accorder le plus d'attention.

Ce graphique a été construit en 2012, UTF-8 devenait l'encodage dominant. Et ça l'est toujours.

Le graphique montre la prévalence de l'UTF-8.
Qu'est-ce que l'UTF-8 et comment ça marche?
UTF-8 encode dans un octet chaque point de code Unicode 0 à 127 (comme en ASCII). Autrement dit, si vous avez écrit votre programme en ASCII et que vos utilisateurs utilisent UTF-8, ils ne remarqueront rien d'anormal. Tout fonctionnera comme prévu. Notez à quel point c'est important. Nous devions maintenir la compatibilité ascendante avec ASCII lors de l'adoption massive de l'UTF-8. Et cet encodage ne casse rien.
Comme son nom l'indique, un point de code se compose de 8 bits (un octet). Certains caractères en Unicode occupent plusieurs octets (jusqu'à 6). C'est ce qu'on appelle la longueur variable. Dans différentes langues, le nombre spécifique d'octets est différent. En anglais - 1, langues européennes (avec alphabet latin), hébreu et arabereprésenté par deux octets par point de code. Pour le chinois, le japonais, le coréen et les autres langues asiatiques , trois octets sont utilisés.
Si vous avez besoin d'un caractère pour occuper plus d'un octet, alors un modèle de bits est utilisé pour indiquer la transition - cela signifie que le caractère continue dans les plusieurs octets suivants.
Et maintenant, comme par magie, nous sommes parvenus à un accord sur la façon d'encoder le cunéiforme sumérien (Habr ne l'affiche pas), ainsi que les icônes emoji !
Pour résumer, nous lisons d'abord la nomenclature pour déterminer la version de codage, puis convertissons le fichier en points de code Unicode, puis affichons les caractères de l'ensemble Unicode.
Enfin sur UTF
Les codes sont des clés . Si je poste le mauvais encodage, vous ne pourrez rien lire. Gardez cela à l'esprit lors de l'envoi et de la réception de données. Dans nos outils quotidiens, cela est souvent abstrait, mais pour nous, les programmeurs, il est important de comprendre ce qui se passe sous le capot.
Comment définissons-nous l'encodage? Puisque le HTML est écrit en anglais et que presque tous les encodages fonctionnent correctement avec l'anglais, nous pouvons spécifier l'encodage au début de la section
<had>
.
<html lang="en">
<head>
<meta charset="utf-8">
</head>
Il est important de le faire au tout début
<had>
, car l'analyse HTML peut recommencer si le mauvais encodage est actuellement utilisé. Vous pouvez également trouver la version d'encodage à partir de l'en - tête Content-Type de la requête / réponse HTTP.
Si le document HTML ne contient aucune mention d'encodage, la spécification HTML5 offre une solution intéressante comme le reniflage de la nomenclature . Avec son aide, nous pouvons déterminer le codage utilisé par le marqueur d'ordre des octets (BOM).
C'est tout?
Unicode n'est pas encore terminé. Comme c'est le cas avec n'importe quel standard, nous ajoutons quelque chose, supprimons quelque chose, offrons quelque chose de nouveau. Aucune des spécifications n'est «complète». Habituellement, il y a 1 à 2 sorties par an, vous pouvez trouver leur description ici .
J'ai récemment lu un bug très intéressant lié à l' affichage incorrect des caractères Unicode russes sur Twitter .
Si vous avez lu jusqu'à la fin, alors vous êtes génial. Je vous suggère de faire vos devoirs. Découvrez comment les sites peuvent se briser lorsqu'ils utilisent un mauvais encodage. Je profitai de cetteextension pour Google Chrome, a changé l'encodage et a essayé d'ouvrir différentes pages. Les informations étaient complètement illisibles. Essayez-le vous-même, à quoi ressemble une souche. Cela vous aidera à comprendre l'importance de l'encodage.

Conclusion
En écrivant cet article, j'ai découvert Michael Everson . Depuis 1993, il a proposé plus de 200 changements à Unicode, ajoutant des milliers de caractères à la norme. En 2003, il était considéré comme le membre le plus productif. Lui seul a grandement influencé le visage d'Unicode. Michael fait partie de ceux qui ont créé Internet tel que nous le connaissons aujourd'hui. Très impressionnant.
J'espère avoir pu vous montrer à quoi servent les encodages, quels problèmes ils résolvent et ce qui se passe lorsqu'ils échouent.