Le code ASCII (American Standard Code for Information Interchange)

Dans les premiers temps de l'informatique, alors que les ordinateurs occupaient des pièces entières et avaient des poids qui se mesuraient en tonne, chaque matériel avait son propre codage pour les caractères. Tout ordinateur était livré avec des sous-programmes et des tables permettant de transposer les codes d'une machine à une autre. Dans les années 60, l'avènement de la mini-informatique grâce aux circuits intégrés fait émerger le besoin d'une standardisation. Mais comment procéder ?

Taille du codage

Le plus petit fragment d'information disponible en informatique est le bit. Mais l'information contenue dans un seul bit est trop petite pour être pertinente. On a donc décidé très tôt de regrouper les bits par paquets, et c'est le groupement de 8 bits qui est le plus petit paquet couramment utilisé. 8 bits représentent un octet.

Un caractère sera systématiquement codé par 8 bits. Avec 8 bits, on pourrait coder en théorie 255 caractères. Initialement, les 8 bits ne sont pas utilisés pour coder les caractères. Seul les 7 premiers bits le sont. Le 8ème sert pour contrôler les erreurs potentielles en étant un bit de parité : il est positionné à 0 ou 1 suivant la parité du nombre de bit à 1.

Ainsi, chaque caractère est codé sur 7bits, c'est à dire au moyen d'un nombre entre 0 et 127.

Table ASCII

La table ASCII ne regroupe pas que des lettres. Elle permet de coder tous les éléments utiles pour la sortie de l'information. Elle contient :

  • 32 caractères de contôle numéroté de 0 à 31. On y trouve par exemple le retour arrière (BACKSPACE : 8), ou le «bip» (BELL : 7)
  • 96 caractères imprimables numérotés de 32 à 127, qui comprennent en particulier :
    • les chiffres de 48 à 57
    • les lettres majuscules de 65 à 90
    • les lettres minuscules de 97 à 122
    ainsi que des symboles de ponctuation et mathématiques.
Le code ASCII (source: wikimedia commons)
Exemple

Considérons le prénom Alice, avec une majuscule au début du prénom. A est codé 65, l est codé 108, i est codé 105, c est codé 99 et e est codé 101. On peut donc dire que Alice correspond à 65 108 105 99 101. Si on code chacun de ces nombres sur un octet (donc sur 8 bits, on ne se soucie pas du bit de parité qu'on laisse à 0), Alice se traduira par :

0100 0001 0110 110 0011 0100 1011 0001 1011 00101

C'est dans ce format que l'ordinateur stockera le prénom d'Alice.

À faire vous même

Traduisez votre prénom en nombre en utilisant le code ASCII puis traduisez ces nombre en binaire pour avoir la représentation de votre prénom. On supprimera les accents.

Visualisation du codage

Il existe de nombreux programmes qui permettent de visualiser le codage des fichiers. On peut par exemple utiliser Ghex qui affiche en hexadécimal le codage du contenu des fichiers. Pourquoi en hexadécimal et pas en binaire ? L'hexadécimal contient seulement deux symbole pour un octet, il est beaucoup plus compact. Prenons l'exemple d'un fichier texte simple alice.txt dans lequel on a juste enregistré au moyen d'un éditeur de texte quelconque le prénom Alice. Si on ouvre le fichier avec Ghex et que l'on navigue dedans, voici ce que l'on obtient :

Ghex sur le A de Alice
Ghex à la fin du fichier

Chaque octet du fichier est donné sous forme hexadécimal, et le caractère inscriptible correspondant est affiché à droite. Pour le A par exemple, 41 en haxadécimal est affiché. 41 en héxadécimal correspond à \(4 \times 16 + 1\), c'est à dire 65, ce qui correspond bien à A en standart ASCII.

Il y a à la fin un point qui ne figure pas dans le texte d'origine. Ce point, cependant, a pour code 0A, c'est à dire 10 en notation décimale. Ce n'est pas le code du point affichable. 10 correspond au code de retour à la ligne. Notre fichier contenait en fait Alice suivi d'un retour à la ligne. Ghex affiche à droite les caractères de contrôle en les remplaçant par un point.

À faire vous même
  • Créez un fichier contenant juste le prénom Alice et ouvrez le avec Ghex.
  • Créez un fichier avec votre nom et prénom SANS UTILISER D'ACCENT, ouvrez le dans Ghex et observez le.
  • Ouvrez dans Ghex un fichier avec du code Python. Repérez des caractères particuliers. Faîtes une capture d'écran.
  • Enfin, téléchargez l'image qui est le fond d'écran de cette page. Ouvrez le fichier enregistré avec Ghex. Faîtes une capture d'écran. Y a t'il des informations lisibles ? Quels ont été les deux logiciels photos utilisés pour fabriquer cette image ?

ASCII étendu

Le codage ASCII est un standard reconnu dans le monde entier mais il est loin d'être suffisant. En effet, il permet de représenter facilement l'anglais, mais il ne contient aucun caractère accentué. Sans même parler des langues avec un alphabet différent (cyrilliques, kanji, etc.). Dans les années 70, la fiabilité des ordinateurs étant accrue, ainsi que la fiabilité des liaisons réseau, on a commencé à utiliser le 8ème bit pour coder des caractères supplémentaires. Cela a conduit à tout un tas de standard différent, répondant à des usages. On a eu des codages qui dépendaient :

  • de la langue (avec des codages régionaux)
  • du système d'exploitation utilisé (le français n'était pas codé de la même façon sous microsoft Windows et sous Mac OS ou les unix
À faire vous même

Recherchez des informations sur les codages cp-1252 et ISO 8859-1. Expliquez à quoi ils servent.

UTF-8

L'informatique s'internationalisant de plus en plus, ces codages différents d'un pays à l'autre rendaient les communications difficiles. Un traducteur qui devait rédiger des fichiers en français et en japonais par exemple n'avait pas la tâche la plus simple pour son travail quotidien. C'est pour répondre à ce besoin que le standard unicode est apparu dans les années 90. En 1993 apparaît la première version de la norme ISO/CEI 10646 qui est le fondement d'UNICODE. Cette norme a pour objectif de représenter la totalité des caractères imprimables sur terre. Sa version la plus connue est la norme utf-8. Actuellement, plus de 90% des serveurs web sur la planète fonctionnent en utf-8, la majorité des systèmes gnu/linux, les système Apple et même Microsoft dans sa version windows 10 bascule des parties en utf-8.

L'utf-8 a le gros avantage de proposer environ 221 caractères possibles, soit plus de 2 millions de caractères. utf-8 représente par contre un inconvénient majeur : le nombre d'octet sur lequel est codé un caractère n'est pas fixe. Les caractères correspondant aux 128 premiers caractères d'ASCII sont identique au standard ASCII et notés sur un octet. Tout les autres caractères sont codés sur plusieurs octets. utf-8 va ainsi coder les caractères sur 1 à 4 octets.

À faire vous même

Ouvrez votre fichier où vous aviez mis votre prénom sans accents. Si votre prénom contient des accents, mettez les. Sinon, rajoutez dans ce fichier un prénom contenant des accents. Ouvrez ensuite le fichier avec Ghex. Combien de bits sont nécessaires pour coder les lettres accentuées que vous avez ? Sont elle visibles dans Ghex ? Prenez une capture d'écran.

Ce nombre variable d'octets complique beaucoup la vie des programmeurs qui doivent adapter leurs programmes de recherches de motifs par exemple, ou de comptage du nombre de caractères. Pour pouvoir être univoque sur les caractères, un code sur un octet commencera par 0, un code sur 2 octets commence par 110 sur le premier octet et 10 sur le second, un code sur 3 octets commence par 1110 sur le premier octet et 10 sur le second et troisième octet, et enfin un code sur 4 octet commence par 11110 et 10 sur les deuxième, troisième et quatrième octet. Tout ceci est résumé dans le tableau ci dessous:

Définition du nombre d'octets utilisés
Représentation binaire UTF-8 Signification
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits

Pour revoir l'ensemble de ces notions en vidéo, vous pouvez consulter ce cours de Christian QUEINNEC qui reprend ces notions

Ce site permet de transformer un texte encodé en UTF-8 en sa représentation binaire. On a ainsi une représentation du code binaire correspondant à un texte.

À faire vous même

Consultez le site ci dessus, et écrivez un texte contenant des accents et le symbole € quelque part. Faites une copie d'écran. Utilisez un logiciel de retouche pour encadrer en rouge la partie binaire représentant le symbole euro

Nous allons voir comment nous pouvons manipuler le codage des caractères en python.

À retenir
  • Pour pouvoir stocker des caractères, on adopte un codage
  • Le code ASCII stocke les caractères sur un octet. Il est normalisé pour 128 caractères
  • Les codes ascii étendu utilisent les 8 bits. Ils varient suivant les systèmes et les régions (cp-1252,iso-8859-1,etc.)
  • le codage UTF-8 permet de stocker tous les caractères de toutes les écritures
  • utf-8 est compatible ascii
  • en utf-8, un caractère peut être stocké sur 1 à 4 octet