Note sur les fichiers de caractères (ASCII)

Cours PLURITAL n°1 du 02/10/2007

Jean-François Perrot

Introduction
L'exemple de RTF
L'exemple de HTML
Conclusion

Introduction, motivation

Les différentes machines interprètent l'information binaire chacune à sa manière.
Bornons-nous à évoquer ici la question des processeurs gros-boutiens et petit-boutiens
(en anglais big-endian/little-endian) : cette distinction, empruntée aux Voyages de Gulliver,
vise l'ordre dans lequel les octets sont interprétés (par exemple, pour y lire un nombre).
Pour une définition, voir l'article de Wikipédia, et pour la terminologie un débat sur la liste Debian.

Il en résulte qu'un fichier binaire aura sur des machines différentes des interprétations différentes,
ce qui nuit gravement à la communication.
C'est pourquoi on emploie souvent les caractères ASCII comme étape intermédiaire d'interprétation :
un fichier qui est réputé contenir uniquement des caractères ASCII est en principe interprété
de la même manière par toutes les machines actuelles.
Par exemple, c'est cette identité de traitement qui rend possible le courrier électronique :
en principe, il doit être entièrement rédigé en ASCII,
et on observe couramment que les caractères non-ASCII sont mal transmis ! Affaire à suivre au cours 3...

Pour mieux comprendre la nécessité d'échanger de l'information sous forme textuelle et non sous forme binaire,
ainsi que les modalités de ces échanges, voyez la série d'articles de Wikipedia (en anglais)

Mais les fichiers ASCII qui sont aujourd'hui échangés à travers le réseau font pour la plupart
l'objet d'une interprétation supplémentaire, par un logiciel comme Word ou comme un navigateur Web.
Nous en évoquerons ici deux exemples : les fichiers RTF et les fichiers HTML.
On pourrait en ajouter bien d'autres, par exemple l'historique uuencode,
le codage en Base64 dont nous reparlerons au cours 3, ou encore BinHex.

L'exemple de RTF


Le format RTF (Rich Text Format) donne la possibilité d'échanger du texte mis en forme
(avec des caractères gras, italiques, des choix de justification, des choix de polices, etc.)
entre des logiciels d'édition normalement incompatibles. Voyez l'article de Wikipédia à son sujet.
Pour comprendre de quoi il retourne, faites l'expérience suivante :
  1. téléchargez le petit fichier Ex.rtf (extrait de l'article de Wikipédia),
  2. inspectez-le avec hexdump (ou avec un éditeur de "texte pur" comme NotePad sous Windows),
    pour constater qu'il ne contient que de l'ASCII
  3. et ouvrez-le enfin avec Word (n'oubliez pas de lui donner l'extension ".rtf").
Vous pourrez aisément fabriquer des fichiers RTF avec Word
en utilisant le format Texte mis en forme (RTF) de la commande  Enregistrez sous... (menu Fichier).
Essayez de retrouver le texte dans la masse d'informations que contient un tel fichier,
et observez comment les caractères non-ASCII sont représentés.

Exercice :  voici une image fidèle d'un fichier Word

fichier Word


Ce fichier a été sauvegardé en RTF, sous le nom ExRTF.rtf.
Le fichier ExRTFb.rtf a été obtenu en supprimant dans ce fichier un grand nombre d'informations jugées superflues.
  1. Téléchargez-les tous les deux et vérifiez que Word vous restitue l'apparence illustrée ci-dessus pour l'un
    et une apparence un peu différente pour l'autre. Attention à bien les nommer avec l'extension ".rtf" !
  2. Quelles informations faut-il restituer à ExRTFb.rtf pour que le titre soit de nouveau centré ?
  3. Comment retrouver la différence de polices dans la ligne 3 ?

L'exemple de HTML

Nous aurons l'occasion de revenir sur HTML (Hypertext Markup Language).
Pour l'instant, nous en noterons deux aspects :
  1. Le codage des lettres accentuées : ces lettres sortent du répertoire ASCII, il faut donc les coder.
    Le procédé traditionnel est de les représenter par des "entités" (c'est le terme consacré dans la grammaire de HTML)
    qui sont de la forme "&", suivi d'une chaîne de caractères explicative à consonance anglaise, suivi de ";".
    Exemples :
  2. L'interprétation de certaines constructions syntaxiques pour engendrer une mise en pages.
    Contentons-nous d'observer avec un navigateur quelconque le code source (ou la page source)
    d'une page Web. Voici par exemple le début de la table du code ASCII :

    <table style="width: 100%; text-align: left;" border="2" cellpadding="2" cellspacing="2">
    <tbody><tr>
    <td>
    <table>
    <tbody>
    <tr>
    <th style="vertical-align: top;">D&acute;c</th>
    <th style="vertical-align: top;"> Hex</th>
    <th style="vertical-align: top;">Car</th>
    </tr>
    <tr>
    <td style="vertical-align: top;">00</td>
    <td style="vertical-align: top;">00</td>
    <td style="vertical-align: top;">NUL</td>
    </tr>

    On voit que l'effet de mise en table est produit par l'interprétation que le navigateur donne de la structure
    <table>... <tr><td> ... </td> ...</tr> ... </table>
    qui est elle-même entièrement rédigée en ASCII (et transmis comme tel sur le réseau).

Conclusion

À titre de comparaison, pour voir à quoi ressemble un fichier qui n'est pas un fichier-texte,
regardez avec hexdump le petit fichier-image flip.gif ...

Les exemples RTF et HTML font apparaître l'ambiguïté du rôle des caractères ASCII :
Comme nous le verrons dans la suite, dans le premier rôle les caractères ASCII seront remplacés par les caractères Unicode,
tandis qu'ils resteront immuables dans leur rôle de métacaractères.
Ce qui fait que la notion de "fichier-texte" est en train d'évoluer :
de "fichier en ASCII pur" on en vient à "fichier de caractères Unicode",
ce qui est par exemple le point de vue adopté par Java dès  l'origine de ce langage.

Toutefois, comme nous le verrons, il ne suffit pas de dire "Unicode" pour spécifier une norme opérationnelle,
il faut encore dire coment Unicode est représenté en machine.
Sur ce point, l'événement majeur est l'adoption par XML du codage Unicode utf-8 comme "codage par défaut",
si bien qu'un fichier XML est, sauf mention contraire, un fichier de caractères en utf-8.
Et comme HTML est vu à présent, sous sa forme XHTML, comme un dialecte de XML,
cette évolution favorable s'étend à tout Internet.

Les logiciels modernes savent traiter utf-8 aussi bien qu'ASCII, les machines sont bien assez puissantes
l'espace-mémoire suffisamment vaste et les réseaux assez rapides pour absorber quelques octets supplémentaires.
La généralisation de cet usage est donc affaire de changement d'habitudes de la part des utilisateurs.
Il s'agit de mieux utiliser les ressources dont nous disposons.
Le but de ce cours est de vous y aider.