Au chapitre 1, nous avons vu que la machine ne manipule que des nombres. Pourtant, vous lisez en ce moment des lettres, des accents, des emojis.
Comment un appareil qui ne connaît que des 0 et des 1 fait-il pour stocker la lettre « é » ou le caractère « 漢 » ? Et que se passe-t-il lorsque deux ordinateurs ne sont pas d'accord sur la façon de les coder ?
Un ordinateur ne stocke que des nombres. Pour qu'il puisse manipuler du texte, il faut donc se mettre d'accord sur une règle qui associe chaque caractère à un nombre. Dans les années 1960, pour que des machines différentes puissent s'échanger du texte sans se tromper, on a eu besoin d'une règle commune, c'est-à-dire d'un standard.
Le premier de ces standards à s'imposer largement est le code ASCII (American Standard Code for Information Interchange).
Conçu au départ par et pour des anglophones, il ne prévoit qu'un petit nombre de caractères : 128 en tout (lettres non accentuées, chiffres, ponctuation et quelques caractères de commande).
Il ne comporte donc ni les lettres accentuées du français, ni les caractères d'autres alphabets (grec, cyrillique, asiatique, etc.).
Chaque caractère y est repéré par un nombre compris entre 0 et 127, ce qui tient sur 7 bits.
Comme l'ASCII ne permet pas d'écrire les caractères propres aux langues européennes, on a créé un nouvel encodage : l'ISO 8859-1, plus souvent appelé latin-1.
Il fonctionne sur un octet (8 bits) par caractère, ce qui permet cette fois de coder 256 caractères. Les 128 premiers sont exactement ceux de l'ASCII, ce qui assure la compatibilité ; les 128 suivants ajoutent les lettres accentuées et les symboles utilisés dans les pays d'Europe de l'ouest.
Le latin-1 avait un défaut : il ne contenait pas le symbole de l'euro (€). Cela a conduit à une petite mise à jour, l'encodage ISO 8859-15, appelé latin-9.
Il reprend le latin-1 presque à l'identique, en remplaçant quelques caractères peu utilisés par le symbole € et quelques lettres qui manquaient, comme œ, Œ ou Ÿ.
Chaque région du monde ayant conçu son propre encodage pour ses caractères locaux, on s'est retrouvé avec une multitude de systèmes incompatibles entre eux : un même fichier pouvait s'afficher correctement sur une machine et devenir illisible sur une autre. Il fallait donc un système unique, valable partout.
C'est le rôle d'Unicode : recenser, à l'échelle mondiale, l'ensemble des caractères de toutes les écritures.
À chaque caractère, Unicode attribue un nom et un identifiant numérique unique.
Attention : Unicode se contente d'associer chaque caractère à un nombre. C'est une immense table de correspondance, mais elle ne dit rien de la manière dont ce nombre sera concrètement écrit en binaire. C'est justement le rôle des encodages comme UTF-8.
(Une visualisation de la table)
Le début de la table Unicode est fait pour correspondre au code ASCII.
La fonction chr prend en paramètre un integer et renvoie le caractère correspondant dans la table Unicode.
>>> chr(65)
'A'
La fonction ord prend en paramètre un caractère et renvoie le nombre au format integer correspondant à ce
caractère dans la table Unicode.
>>> ord("A")
65
Compléter la fonction affiche_caracteres qui prend deux integers a et b et qui affiche les
caractères entre le a-ième caractère et le b-ième caractère de la table Unicode.
La fonction renverra None.
À faire dans le cahier.
" ".# Pas de test fait ici.
Unicode donne à chaque caractère un nombre, mais il reste à décider comment écrire ce nombre en binaire dans un fichier ou en mémoire. C'est ce qu'on appelle l'encodage.
Plusieurs méthodes existent ; la plus utilisée aujourd'hui est l'UTF-8.
Son principe est d'utiliser un nombre d'octets variable selon le caractère : de un à quatre octets. Les caractères qui appartiennent déjà à l'ASCII ne prennent qu'un seul octet, tandis que les caractères plus rares en occupent davantage.
C'est cette compatibilité avec l'ASCII, combinée à la possibilité de coder n'importe quel caractère Unicode, qui explique que l'UTF-8 soit aujourd'hui le format dominant sur le web.
L'UTF-16 sert lui aussi à encoder les nombres attribués par Unicode, mais suivant une autre méthode.
Ici, chaque caractère occupe deux ou quatre octets. Un caractère aussi simple qu'une lettre de l'alphabet y prend donc au minimum deux octets, alors qu'il n'en prendrait qu'un seul en UTF-8. Comme les textes courants contiennent énormément de caractères ASCII, l'UTF-16 est souvent moins économe que l'UTF-8.
Il reste toutefois utilisé en interne par certains systèmes et langages de programmation pour représenter le texte en mémoire.