ASCII et Unicode sont deux normes qui font référence à la représentation numérique du texte, en particulier les caractères qui composent le texte. Cependant, les deux normes sont très différentes, avec de nombreuses propriétés reflétant leur ordre de création respectif.
Le code standard américain pour l'échange d'informations (ASCII), sans surprise, s'adresse à un public américain, écrivant dans l'alphabet anglais. Il traite des lettres non accentuées, telles que A-Z et a-z, ainsi qu'un petit nombre de symboles de ponctuation et de caractères de contrôle.
En particulier, il n'y a aucun moyen de représenter des mots empruntés à d'autres langues, comme café en ASCII, sans les angliciser en les remplaçant par des caractères accentués (par exemple café ). Des extensions ASCII localisées ont été développées pour répondre aux besoins de diverses langues, mais ces efforts ont rendu l'interopérabilité gênante et ont clairement étiré les capacités d'ASCII.
En revanche, le jeu de caractères codés universels (Unicode) se situe à l'extrémité opposée de l'échelle d'ambition. Unicode tente de répondre au plus grand nombre possible de systèmes d'écriture dans le monde, dans la mesure où il couvre les langues anciennes et l'ensemble de symboles expressifs préféré de tous, les emoji.
En termes simples, un jeu de caractères est une sélection de caractères (par exemple, AZ) tandis qu'un codage de caractères est une correspondance entre un jeu de caractères et une valeur qui peut être représentée numériquement (par exemple, A=1, B=2).
La norme ASCII est en fait à la fois :elle définit le jeu de caractères qu'elle représente et une méthode de mappage de chaque caractère à une valeur numérique.
En revanche, le mot Unicode est utilisé dans plusieurs contextes différents pour signifier différentes choses. Vous pouvez le considérer comme un terme global, comme ASCII, pour faire référence à un jeu de caractères et à un certain nombre d'encodages. Mais, comme il existe plusieurs encodages, le terme Unicode est souvent utilisé pour désigner l'ensemble global de caractères, plutôt que la façon dont ils sont mappés.
En raison de sa portée, Unicode représente beaucoup plus de caractères que l'ASCII. L'ASCII standard utilise une plage de 7 bits pour encoder 128 caractères distincts . Unicode, en revanche, est si volumineux que nous devons utiliser une terminologie différente juste pour en parler !
Unicode prend en charge 1 111 998 points de code adressables. Un point de code est à peu près analogue à un espace réservé à un personnage, mais la situation est beaucoup plus compliquée que cela lorsque vous commencez à vous plonger dans les détails !
Une comparaison plus utile est le nombre de scripts (ou de systèmes d'écriture) actuellement pris en charge. Bien sûr, ASCII ne gère que l'alphabet anglais, essentiellement l'écriture latine ou romaine. La version d'Unicode produite en 2020 va beaucoup plus loin :elle inclut la prise en charge d'un total de 154 scripts.
La plage de 7 bits d'ASCII signifie que chaque caractère est stocké dans un seul octet de 8 bits; le bit de réserve n'est pas utilisé en ASCII standard. Cela rend les calculs de taille triviaux :la longueur du texte, en caractères, correspond à la taille du fichier en octets.
Vous pouvez le confirmer avec la séquence suivante de commandes bash. Tout d'abord, nous créons un fichier contenant 12 lettres de texte :
$ echo -n 'Hello, world'> foo
Pour vérifier que le texte est dans l'encodage ASCII, nous pouvons utiliser le fichier commande :
$ fichier foo
foo :texte ASCII, sans fin de ligne
Enfin, pour obtenir le nombre exact d'octets occupés par le fichier, nous utilisons le stat commande :
$ stat -f%z foo
12
Étant donné que la norme Unicode traite une plage de caractères beaucoup plus large, un fichier Unicode occupe naturellement plus d'espace de stockage. La quantité exacte dépend de l'encodage.
Répéter le même ensemble de commandes qu'auparavant, en utilisant un caractère qui ne peut pas être représenté en ASCII, donne ceci :
$ echo -n '€'> foo
$ fichier foo
foo :texte Unicode UTF-8, sans fin de ligne
$ stat -f%z truc
3
Ce caractère unique occupe 3 octets dans un fichier Unicode. Notez que bash a automatiquement créé un fichier UTF-8 car un fichier ASCII ne peut pas stocker le caractère choisi (€). UTF-8 est de loin le codage de caractères le plus courant pour Unicode ; UTF-16 et UTF-32 sont deux encodages alternatifs, mais ils sont beaucoup moins utilisés.
UTF-8 est un codage à largeur variable, ce qui signifie qu'il utilise différentes quantités de stockage pour différents points de code. Chaque point de code occupera entre un et quatre octets, avec l'intention que les caractères plus courants nécessitent moins d'espace, fournissant un type de compression intégrée. L'inconvénient est que la détermination des exigences de longueur ou de taille d'un morceau de texte donné devient beaucoup plus compliquée.
Pour la compatibilité descendante, les 128 premiers points de code Unicode représentent les caractères ASCII équivalents. Étant donné que UTF-8 encode chacun de ces caractères avec un seul octet, tout texte ASCII est également un texte UTF-8. Unicode est un sur-ensemble d'ASCII.
Cependant, comme indiqué ci-dessus, de nombreux fichiers Unicode ne peuvent pas être utilisés dans un contexte ASCII. Tout caractère hors limites s'affichera de manière inattendue, souvent avec des caractères de remplacement complètement différents de ceux qui étaient prévus.
Dans la plupart des cas, ASCII est largement considéré comme une norme héritée. Même dans les situations qui ne prennent en charge que l'écriture latine (où la prise en charge complète des complexités d'Unicode n'est pas nécessaire, par exemple), il est généralement plus pratique d'utiliser UTF-8 et de tirer parti de sa compatibilité ASCII.
En particulier, les pages Web doivent être enregistrées et transmises en utilisant UTF-8, qui est la valeur par défaut pour HTML5. Cela contraste avec le Web précédent, qui traitait par défaut en ASCII avant d'être remplacé par le latin 1.
La dernière révision d'ASCII a eu lieu en 1986.
En revanche, Unicode continue d'être mis à jour chaque année. De nouveaux scripts, personnages et surtout de nouveaux emoji sont régulièrement ajoutés. Avec seulement une petite fraction de ceux-ci alloués, le jeu de caractères complet est susceptible de croître et de croître dans un avenir prévisible.
ASCII a servi son objectif pendant de nombreuses décennies, mais Unicode l'a maintenant remplacé efficacement à toutes fins pratiques autres que les systèmes hérités. Unicode est plus grand et, par conséquent, plus expressif. Il représente un effort de collaboration à l'échelle mondiale et offre une bien plus grande flexibilité, bien qu'au détriment d'une certaine complexité.