L'écrit étant un moyen de choix pour conserver et échanger de l'information, l'idée de coder les symboles utilisés pour écrire surgit assez naturellement lorsqu'il est question de traitement d'information.
Le problème qui nous intéresse ici est bien celui du codage de l'écriture, en excluant tout ce qui concerne la mise en forme du texte contribuant l'aspect visuel d'un document (police, graisse, inclinaison, taille et couleur des caractères, indications de mise en page...).
Un logiciel permettant de créer et modifier des fichiers ne contenant que du texte est appelé un éditeur de texte pur (ou texte brut). C'est le cas du bloc-note sous Windows, de Gedit sous Linux, de Notepad++...
Si un fichier est un fichier texte pur, alors un éditeur de texte pur doit pouvoir afficher toute l'information contenue dans le fichier sous la forme d'un texte lisible, sous réserve d'être correctement configuré.
Les fichiers du web (html, javascript, css) ainsi que les fichiers de code source des programmes (comme les fichiers de code python d'extension .py) sont des fichiers texte pur.
Tant que l'information ainsi codée n'est destinée qu'à circuler en interne dans une entreprise, un pays, ou à n'être exploitée que sur un type de machine, la coexistence de nombreux systèmes différents ne pose pas de problèmes.
Cependant, la multiplication des échanges d'information sous forme électronique a fait apparaître l'intérêt d'un système d'encodage universel, permettant d'encoder n'importe quel caractère d'écriture, et interprétable par toutes les machines. Ce système appelé Unicode repose sur la notion de Jeu Universel de Caractères (JUC, ou UCS pour Universal Character Set.)
L'ASCII était codé sur 7 bits, ce qui permettait de coder 27=128 caractères, soient les lettres de l'alphabet en majuscule et minuscule, les chiffres, les principaux caractères de ponctuation et quelques symboles, notamment mathématiques. Certains codes n'étaient pas attribués à des caractères, mais constituaient des codes de contrôle permettant d'envoyer des commandes comme 'saut de ligne', 'saut de page', 'retour arrière', 'signal sonore'... Les codes 0 et 127 n'étaient pas attribués, pour des raisons pratiques liées notamment à l'emploi de cartes perforées pour entrer l'information.
En l'absence de caractères spéciaux comme é,ç..., l'ASCII était bien adapté pour écrire l'anglais, mais pas vraiment pour les langues utilisant d'autres caractères, comme le français.
Cependant des langues comme le chinois ou le japonais s'écrivent en utilisant bien plus de 256 symboles différents. Des normes différentes ont donc été élaborées pour écrire ces langage, utilisant cette fois deux octets par caractère, ce qui permet de coder jusqu'à 216=65536 caractères différents.
Pour avoir une idée de la complexité engendrée par cette multitude des pages de code, on peut sous Windows lancer le programme charmap (table des caractères). Ce programme montre les caractères affichables par ordre de code croissant (choisir une police de caractères assez générique comme Arial). En cochant la case 'affichage avancé', on fait apparaître une boîte de sélection proposant, outre Unicode qui est maintenant le jeu par défaut, un certain nombre d'autres jeux de caractères. Le matricule unicode du caractère sélectionné apparaît dans la barre d'état en bas de la fenêtre, précédé de la lettre U. A côté, entre parenthèses, aparaît le code dans le jeu de caractère (page de codes) sélectionné. Tous les codes sont écrits en hexadécimal.
Le principe de base consiste à répertorier dans un seul registre tous les caractères d'écriture employés sur Terre (y compris dans le passé), et à attribuer à chaque caractère de ce Jeu Universel de Caractères (JUC/UCS) un matricule unique, qu'on appelle son point de code Unicode.
Les valeurs des points de code Unicode sont comprises entre 0 et (10FFFF)16, ce qui représente un peu plus d'un million de possibilités. Tous les codes ne sont cependant pas attribués à un caractère ou à un signe. Même ainsi, cela laisse de quoi représenter un très grand nombre de symboles différents. La norme est ainsi actualisée chaque année, avec l'introduction de nouveaux symboles (par exemple de nouveaux Emoji...)
La méthode d'encodage la plus utilisée pour les langues occidentales, en particulier sur Internet, est appelée UTF-8. Dans ce format, la taille minimale utilisable pour coder un caractère ("codet") est de 1 octet, mais un caractère peut occuper 2,3 et jusqu'à 4 octets. UTF-8 est conçu pour que les symboles les plus utilisés dans les langues occidentales (chiffres, lettres de l'alphabet) n'occupent qu'un seul octet, de façon a économiser l'occupation de la mémoire et de la bande passante. Ce parti-pris permet aussi la compatibilité amont avec l'ASCII : un fichier ne contenant que des caractères du jeu ASCII sera encodé exactement de la même façon en ASCII et en UTF-8.
On peut citer parmi les autres formats d'encodage pour Unicode l'UTF-16, dans lequel un caractère peut occuper soit 2 octets, soit 4 octets, et l'UTF-32, dans lequel tous les caractères sont codés sur 4 octets. UTF-16 est souvent abusivement dénommé "UCS" ou "UCS-2" sous Windows, où il a été largement utilisé. UTF-32 est réservé à des usages spécifiques car il "gaspille" beaucoup d'espace mémoire.
Pour vérifier que ces affichages étranges sont bien dus à un problème d'encodage, sous Firefox on peut ouvrir le contenu de chacun des cadres seul dans une nouvelle page(clic-droit sur le cadre,"ce cadre","afficher ce cadre seul" ou "ouvrir ce cadre dans un nouvel onglet') . Ouvrir ensuite le menu de Firefox, choisir "Plus" puis "encodage du texte" : on obtient une liste des (très nombreux) encodages gérés par Firefox. Pour une page web qui n'aurait pas déclaré son encodage et dont l'encodage n'aurait pas été détecté automatiquement par Firefox, ce menu permet de corriger le problème, comme on peut le vérifier ici en basculant entre "Unicode" et "Occidental".
Cette fonctionnalité de choix de l'encodage, autrefois très utile dans un navigateur, tend à disparaître des versions récentes (Chrome et Edge ne la proposent déjà plus) car la généralisation de l'utilisation d'UTF-8 sur le Web la rend peu à peu inutile.
Les éditeurs de texte pur permettent généralement un choix d'encodages (dont utf-8) lors de l'enregistrement d'un texte. Un éditeur aussi simple que le bloc-note de Windows propose déjà trois encodages différents, tandis que Notepad++ par exemple en permet une petite cinquantaine.
La fonction Python chr permet d'obtenir le caractère correspondant à un code Unicode. Par exemple, en écrivant dans la console :
Si l'entier passé en paramètre à la fonction chr n'a pas de caractère Unicode correspondant, chr retourne une chaîne de caractères composée du "caractère d'échappement", "\", suivi généralement du code en hexadécimal. Pour quelques codes de contrôle, chr renvoie plutôt leur signification : il s'agit des codes 9 ('\t' comme tabulation), 10 ('\n' comme new line) et 13 ('\r' comme return carriage).
La fonction Python ord permet d'obtenir le code (en base 10) d'un caractère. Par exemple, en écrivant dans la console :
Télecharger les fichiers ci-dessous en faisant un clic-droit sur le lien puis en choisissant "enregistrer la cible du lien sous". Sachez dans quel dossier vous avez enregistré les fichiers...
Copier/coller le code ci-dessus dans l'éditeur Python.
Dans le code source du programme, changer la valeur de la variable chemin: ce doit être le chemin du dossier où les fichiers à analyser sont enregistrés. Il est possible de copier-coller ce chemin depuis la barre d'adresses de l'explorateur de fichiers. Sous Windows il faudra remplacer tous les \ par des \\ ou des /. La variable fichier doit contenir le nom du fichier que l'on veut analyser, et la variable "encodage" le nom de l'encodage à utiliser ("utf-8", "iso-8859-15" ou "cp1252"). Toutes ces variables sont des chaines de caractères, il faut donc écrire leurs valeurs entre " " ou ' '.
A l'aide du programme et des fichiers texte téléchargés, étudier les compatibilités et incompatibilités entre les encodages UTF-8, ISO-8859-15 et Win1252. On pourra notamment vérifier que les fichiers proposés sont bien des fichiers de texte pur, s'interroger pour chaque encodage sur les valeurs que peut prendre un octet, au nombre d'octets par caractère, aux similitudes et différences entre les valeurs des codes pour un même caractère, et proposer une explication aux problèmes d'affichage rencontrés lorsqu'un fichier texte est lu avec un encodage différent de celui avec lequel il a été enregistré (ex: fichier utf-8 lu comme un fichier iso-8859-15).
▶ Prévoir de présenter les conclusions à l'oral.