Plan du site  
français  English
pixel
pixel

Articles - Étudiants SUPINFO

Chapitre 04 - Le codage des caractères

PLAN DU CHAPITRE

L’homme a toujours essayé de communiquer avec ses semblables. Même si le début a été difficile, il se sert le plus souvent de la parole pour transmettre ses idées. Pour mieux les faire comprendre et les transmettre, ses idées sont codées en utilisant un vocabulaire commun. Le caractère commun est resté, et maintenant, nous parlons de normalisation ou de standardisation.

Il existe de nombreux types de vocabulaire pour communiquer. Car il est nécessaire de tenir compte des environnements de diffusion de la parole. Ainsi, dans certains cas, lorsqu’il n’est pas possible d’utiliser la parole car trop de bruit, d’éloignement ou l’un des protagonistes est sourd et/ou muet, il évolue. Nous pouvons alors coder l’information en utilisant le langage des signes à la place du code vocal.

Figure 1.1. Lettres de la langue des signes

Lettres de la langue des signes

Si l’éloignement est très important, les signes des mains ne suffisent plus pour transmettre l’information en temps réel. Nous pouvons nous déplacer, mais si nous souhaitons une transmission très rapide, il est préférable d’utiliser des moyens comme des signaux de fumée, … ou des sms,….

Figure 1.2. Communication par signaux de fumée

Communication par signaux de fumée

Si les 2 communicants ne sont pas présents au même moment, l’émetteur peut écrire le message en utilisant des symboles pour le coder et le stocker sur un support comme le papier, un serveur, …..

Quelque soit la situation, il est nécessaire de coder l’information pour la stocker et/ou la transmettre d’un communicant à l’autre.

Il existe 2 types de caractères :

  • Editables : les lettres majuscules et minuscules, caractères spécifiques, chiffres, signes mathématiques, ponctuation, ... .

  • Non éditables (ou fonctions particulières) : Les tabulations, retours à la ligne, espaces, … .

Le codage a évolué au cours du temps, en particulier avec l’apparition de l’ordinateur (transmission par réseau et moyen de stockage), il a été nécessaire d’élaborer des standards de codage des données textuelles pour faciliter leur manipulation par des outils informatiques (logiciel) à travers le monde. Nous pouvons représenter l’ensemble des caractères par des codes binaires de longueur fixées. Tous ces caractères sont codés sous forme binaire pour les interpréter par l’ordinateur. Il existe diverses tables de codage dont nous ferons l’étude :

  • Le codage ASCII.

  • Les codages UNICODES.

  • Les codages UTF.

OBJECTIF DU CHAPITRE

Le but de ce chapitre est de pouvoir étudier est comprendre comment les caractères sont stockées dans une architecture à nombres biniares. Nous étudirons différentes normes de codage pour les caractères. Après ce chapitre, vous pourrez distinguer un codage de caractères pour agir dessus le cas échéant. Ce chapitre marquera la fin des codages dans le cours d'architectures des ordinateurs, n'oubliez pas que les machines sont reliées et que la couverture de transfère se fait en numérique.

UN PEU D’HISTOIRE

Le code bilitère de Francis BACON (1623) consiste à coder une lettre par un ensemble de 5 symboles, pris parmi 2 symboles possibles (chaque symbole désignant une police de caractères) afin de dissimuler un message secret dans un message de camouflage (processus de stéganographie).

Figure 1.3. Francis Bacon et son système de codage

Francis Bacon et son système de codage

En 1791, les frères CHAPPE (en particulier Claude CHAPPE) mettent au point un système de transmission rapide des informations qui s’avéra très utile pour transmettre les ordres et recevoir des nouvelles pendant la Révolution.

Figure 1.4. Claude Chappe

Claude Chappe

Il fut baptisé "tachygraphe" (écriture rapide) :

  • du grec takhus qui signifie "rapide", "vitesse".

  • du grec graphein qui signifie "écrire".

Figure 1.5. Tachygraphe de Chappe

Tachygraphe de Chappe

Il fut rebaptisé plus tard télégraphe (écriture à distance) : le préfixe télé venant du grec têle signifiant loin de, à distance.

Le système utilisait 3 bras articulés qui pouvaient se positionner à la verticale, l’horizontal ou former un angle de 45° (ces positions étaient distinguables à grande distance).

Ces différentes positions permettaient d’obtenir 196 signaux différents :

  • 92 signaux de correspondance pour transmettre l’information.

  • des signaux réglementaires pour que l’émetteur et le récepteur se coordonnent (un moyen de transmission nécessite un protocole de transmission, donc la réservation de signaux pour transmettre des informations de service).

  • 96 signaux formaient un code qui n’était connu (au début) que des directeurs des centres de Paris et de Strasbourg (pour des raisons de sécurité).

La première vraie dépêche fut envoyée le 15 août 1794 pour annoncer la reprise du Quesnoy par les Français.

Figure 1.6. Reprise du Quesnoy

Reprise du Quesnoy

Le tachygraphe était un télégraphe optique. Les avancés dans les domaines de l’électricité et de l’électromagnétisme permirent à Samuel MORSE de mettre au point le télégraphe électrique en faisant varier le rythme des impulsions électrique.

Figure 1.7. Samuel Morse

Samuel Morse

Il réalise, le 24 mai 1844, la première liaison de télégraphie électrique entre Washington et Baltimore.

Le message à télégraphier est converti en une suite de traits et de points (des impulsions électriques longues et courtes) selon le code Morse (créé le 18 octobre 1832).

Figure 1.8. Le code Morse

Le code Morse

Le code Morse est un code binaire mais le nombre de bits varie selon le symbole à coder. Il comporte un Emetteur et un Récepteur. L’émetteur permet de créer et d’envoyer des impulsions électriques. Le récepteur inscrit des traits et des points sur un ruban entraîné par un moteur. Le stylet se déplace grâce à l’électro-aimant qui réagit aux impulsions reçues.

Figure 1.9. Les appareils du code Morse

Les appareils du code Morse

Jean Maurice Emile BAUDOT entre à l’administration des télégraphes. Il cherche un moyen d’augmenter le débit des communications (qui est limité par les capacités des opérateurs humains). Finalement, il met au point un système électromécanique d’envoi et de réception de signaux permettant de multiplier la quantité d'informations circulant sur une ligne. Ce qui lui vaut la médaille d’or à l’exposition universelle de 1878.

Figure 1.10. Jean Maurice Emile Baudot

Jean Maurice Emile Baudot

Le système utilisait :

  • un distributeur qui multiplexait les signaux binaires des différentes lignes dans le temps (grâce à un moteur qui passait d’une ligne à l’autre).

  • un clavier à 5 touches qui permettait d’envoyer un code binaire sur 5 bits.

  • une imprimante, située à l’autre bout de la ligne qui imprimait le message reçu sur une bande de papier :

    • un trou correspondait à un 1.

    • un blanc correspondait à un 0.

Figure 1.11. La machine de Baudot

La machine de Baudot

Le code de Baudot utilise 5 bits (il s’inspire probablement du code à 4 bits mis au point par Gauss et Weber en 1833) ce qui permet de former 25=32 symboles distincts. C’est insuffisant pour transmettre les 26 lettres de l’alphabet et les 10 chiffres, Emile Baudot décide alors de réserver 2 combinaisons pour commuter entre 2 tables de symboles.

Figure 1.12. Correspondance lettres et chiffres pour la machine de Baudot – CCITT#1

Correspondance lettres et chiffres pour la machine de Baudot – CCITT#1

Si nous souhaitons transmettre une série de chiffres, nous passons d’abord en mode chiffre en envoyant le code FigureShift, puis nous transmettons les codes binaires correspondant aux chiffres.

Si nous voulons repasser en mode lettre pour transmettre des mots, il faut d’abord envoyer le code LetterShift avant de transmettre les bits correspondant aux lettres.

Ce code fut alors admis comme le premier langage télégraphique normalisé par le CCITT (Consultative Committee for International Telegraph and Telephone) : il est désigné sous le nom de CCITT#1.

En 1901, Donald MURRAY réorganise le code de manière à ce que l’utilisation des caractères les plus courants minimise les transitions entre les 5 bits (de manière à minimiser l’usure du matériel).

Ce code (qui fut remodifié par la Western Union) devint le code CCITT#2.

Figure 1.13. Correspondance lettres et chiffres pour la machine de Baudot – CCITT#2

Correspondance lettres et chiffres pour la machine de Baudot – CCITT#2

Avec l’apparition des normes CCITT#1 et CCITT#2 d’une part et le développement des télécommunications, il devint possible de construire et commercialiser des téléscripteurs pour transmettre très rapide, de manière économique et relativement fiable des messages grâce au réseau télex.

Figure 1.14. CCITT #1 et CCITT #2 par les téléscripteurs

CCITT #1 et CCITT #2 par les téléscripteurs

Progressivement des sociétés (AT&T, Teletype …) ont créé leurs propres variantes du code CCITT #2.

Plus tard avec l’apparition de l’ordinateur, différents codes ont été mis au point par les constructeurs pour gérer les symboles sur leur machines (DEC a créé le code RADIX-50 puis SIXBIT pour ses machines).

Vers 1961 (avant l’ASCII), il y avait plus de 60 façons de représenter les caractères dans un ordinateur ce qui rendait difficile la transmission d’informations entre les ordinateurs.

LE CODAGE ASCII

En mai 1961 (ou 1963), Robert William BEMER (dit Bob BEMER), le responsable des standard de programmation chez IBM, propose à l’ANSI un code qui serait commun à l’ensemble des ordinateurs afin de faciliter la transmission des informations. Le code ASCII (American Standard Code for information Interchange) 7 bits est né.

Figure 1.15. Robert Bemer, père de l’ASCII

Robert Bemer, père de l’ASCII

Robert Bemer prend part au comité qui va établir la norme X 3.4 en 1968.

Cette norme fut proposée aux organismes internationaux, l’ASCII devient alors :

Figure 1.16. Les 128 codes de l’ASCII 7 bits

Les 128 codes de l’ASCII 7 bits

Sur l’octet qui est un mot mémoire, le bit non utilisé fut pris comme un bit de parité (parity check) de la manière suivante :

  • nous effectuons l'addition des 7 bits d'informations.

  • nous regardons si le bit de poids faible du résultat est à 0 (pair ou even) ou à 1 (impair ou odd).

  • nous comparons ce bit avec le bit de parité :

    • s'il est identique, il y a de bonnes chances que la transmission soit correcte.

    • sinon il existe au moins une erreur de parité (un bit a changé de valeur à cause d'un problème électronique).

Ce mécanisme a été standardisé :

  • par le comité ANSI (USA) en 1976 : ANSI X 3.16.

  • au niveau mondial, par le comité CCITT : V.4.

Le bit de parité n'est pas suffisant pour garantir l’intégrité de la transmission et du stockage car deux changements de parité peuvent leurrer ce mécanisme de détection mais il a été (est) utilisé pour fiabiliser les communications et le stockage des données (par exemple, barrettes mémoire dotées de bit de parité).

Lorsque d'autres méthodes de détection et de correction des erreurs ont été mises en place, le bit de parité de l'ASCII a été utilisé pour stocker de nouveaux symboles.

Le DOS (Disk Operating System ; système d’exploitation de Microsoft pour l’IBM PC) proposait alors de charger des pages de code supplémentaires adaptées au pays (par exemple, il existe une page de code latin qui propose les caractères accentués pour les français).

LE CODAGE EBCDIC VERS UNICODE

Le codage EBCDIC a été proposé par IBM vers 1965 au moment de la commercialisation de l’IBM 360.

Ce code dérive de codes plus anciens développés par IBM et respecte les conventions établies par HOLLERITH pour l’utilisation des cartes perforées :

  • les cartes devaient pouvoir être lues par des humains (d’où l’utilisation du DCB).

  • certaines dispositions permettent de distinguer facilement les chiffres des lettres.

  • chaque symbole est codé avec au moins un trou pour synchroniser les lecteurs de cartes … .

Ces conventions entraînent une sous-utilisation des combinaisons (il y a des trous dans la table EBCDIC) :

Figure 1.17. Table EBCDIC

Table EBCDIC

Lorsque l’ASCII a été proposé, IBM a essayé de réagir afin de protéger son investissement. Cependant, l’ASCII a progressivement supplanté l’EBCDIC. Les raisons avancées sur l’échec de l’EBCDIC face à l’ASCII étaient :

  • qu’il existait différentes versions de l’EBCDIC (créées par IBM et des concurrents) qui étaient incompatibles entre elles.

  • certains caractères de ponctuation étaient absents de l’EBCDIC mais présents dans l’ASCII.

La table ASCII fut mise au point aux Etats-Unis, elle permettait de coder les caractères de la langue anglaise ainsi que des symboles spécifiques comme le dollar ($).

Lorsqu’une application devait être utilisée dans un autre pays (la France ou l’Allemagne), certains caractères doivent être ajoutés (les lettres accentuées, le ß …).

Dans certains pays (la Russie, les pays arabophones …), il fallait ajouter un alphabet complet (l’alphabet cyllirique par exemple).

L’ajout de ces caractères s’effectuait grâce au 8ème bit de la table ASCII qui permettait de coder 128 caractères spécifiques à certaines zones géographiques (il fallait alors charger une page de code pour disposer des caractères propres à sa langue).

La multitude des langues et des symboles ont entraîné la création de nombreuses pages de code :

  • la communication (par mail) entre personnes utilisant des alphabets différents pouvaient être complexe (certains caractères étaient mal interprétés).

  • le déploiement des logiciels au niveau international était plus coûteux.

L’ISO et l’IEC (International Electrotechnical Commission) dispose de comités communs pour élaborer les normes.

Le JTC1 (Joint Technical Committee 1) s’occupe de tout ce qui touche à l’informatique (logiciel, microprocesseur …).

Il dispose de sous-comités pour gérer ces différents aspects : le SC2 (Sub Committee 2) est responsable du codage des caractères. En 1984, ce sous-comité formait un groupe de travail en vue "d’élaborer une norme établissant un répertoire de caractères graphiques des langues écrites du monde et son codage".

Ce groupe de travail essaye de recenser tous les caractères, symboles, glyphes, et lettres, nombres, idéogrammes, logogrammes du monde entier afin de constituer l’UCS (Universal Character Set).

Le gros défi à surmonter est qu’un même symbole (une lettre par exemple) peut être vu de différentes manières d’une langue à l’autre.

Pour contourner ce problème, il a fallu d’utiliser des caractères abstraits (a … z, ^, ¨, Щ, گ …) qui sont considérés comme des symboles de base.

Certains symboles usuels sont décomposés en caractères abstraits. Par exemple le â est vu comme un a et un ^.

Figure 1.18. Table de caractères

Table de caractères

À la même époque, Joe BECKER de Xerox à Palo Alto travaillait sur un jeu de caractères universel qu’il nommait Unicode en 1987.

Figure 1.19. Joe Becker

Joe Becker

En 1988, plusieurs industriels, dont Xerox, se réunissent pour former le consortium Unicode.

Le consortium Unicode et le groupe de travail du JTC1/SC2 ont commencé à collaborer à la fin 1991 afin de faire converger les 2 répertoires (et ainsi n’avoir qu’une seule norme au niveau mondial). Cette convergence fut effective en janvier 1992. Depuis cette date, il existe une liaison entre les 2 organisations afin de synchroniser leurs travaux et de conserver la corresponde entre les 2 répertoires.

Les 2 répertoires sont désormais identiques (les mêmes codes désignent les mêmes caractères abstraits), mais ils demeurent différents d’un point de vue finalité :

  • l’ISO 10646 n’est qu’une simple table construite comme l’extension d’autres normes (tables) comme l’ISO 8859 (contenant le latin-1).

  • l’Unicode ajoute des règles pour les tris (à quoi correspond la caste quand il y a plusieurs "alphabets" ?), les césures et la combinaison des accents avec des caractères, des d'algorithmes pour l’écriture bidirectionnelle pour des langues comme l’hébreux ou l’arabe... L’Unicode permet donc de manipuler tous les caractères de toutes les langues en proposant un code 32 bits. Cependant, les codes ne sont pas manipulés explicitement pour éviter que chaque caractère occupe 4 octets. Nous manipulons un format plus répandu, L’UTF-8.

L'UCS comprend plus d‘un million de caractères abstraits mais actuellement, seuls les 65536 premiers, qui constituent le PMB (Plan Multilingue de Base) sont utilisés.

Une certaine compatibilité ascendante est assurée entre ce PMB et les tables existantes :

  • les 128 premiers caractères qui correspondent à l’ASCII 7 bits.

  • les 128 caractères suivants correspondent aux caractères de la table ISO 8859-1 (le latin-1).

Le PMB et plus généralement l’UCS contient des trous qui sont disponibles pour de futures évolutions de la table.

LE CODAGE UTF

L’UTF (UCS Transformation Format) est un mécanisme de traduction des codes UCS en des nombres codés sur 8 bits (UTF-8), 16 bits (UTF-16) ou 32 bits (UTF-32).

Ce système a été mis au point afin de faciliter la prise en charge l’évolution de l’UCS par les systèmes de façon transparente (pas besoin de modifier les API (Application Programming Interface)).

Ce système permet aussi de transférer des caractères UCS sur le réseau utilisant du "vieux" matériels (nous transformons les caractères UCS en une suite d’octets grâce à l’UTF-8).

Pour l’UTF-8, cette transformation est décrite dans la norme Unicode mais également dans la RFC (Request For Comment) 3629. Pour déterminer le nombre d’octets utilisés pour coder un caractère UCS, l’application doit analyser le ou les bits de poids fort des octets.

Figure 1.20. Table UTF-8

Table UTF-8

Le tableau de la figure ci-dessus montre la correspondance entre le numéro du caractère (en hexadécimal) et le format des octets à transmettre. Cette transformation est construite de manière à n’utiliser qu’un octet pour transporter les caractères de la table ASCII 7 bits.

Par exemple, nous pouvons coder A et à en UTF-8 :

Table 1.1. Table UTF-8 POUR A et à

Caractère Unicode Décimal caractère Codage binaire UTF-8 Codage hexadécimal UTF-8
A 65 01000001 41
à 224 11000011 10100000 C3A0

Pour l’UTF-16, cette transformation, décrite dans la RFC 2781, consiste à utiliser des groupes de 16 bits pour coder l’information (soit 2 octets) en respectant les règles suivantes :

  • les caractères du plan multilingue de base n’utilisent qu’un seul bloc de 16 bits.

  • les caractères dont le code est compris entre 1000016 et 10FFFF16 sont représentés par 2 valeurs de 16 bits :

    • la première appartient à [D80016 ; DBFF16]

    • la seconde appartient à [DC0016 ; DFFF16]

  • les caractères dont le code est supérieur à 10FFFF16 ne peuvent pas être représentés en UTF-16.

Cette transformation, plus exactement l’utilisation de valeurs comprises appartenant aux intervalles [D80016 ; DBFF16] et [DC0016 ; DFFF16] est possible car le plan multilingue de base (comme l’UCS d’une manière générale) comporte des trous. Cela signifie que si le PMB est modifié (que des caractères sont ajoutés), l’UTF-16 devra également être modifiée.

La transformation s’effectue par :

  • si le code du caractère est inférieur à 1000016, nous le transformons simplement en un entier non-signé codé sur 16 bits.

  • sinon, nous posons U’ = U - 1000016. Ce U’ est codable sur 20 bits qui sont répartis entre 2 blocs de 16 bits (32 bits) de la manière suivante :

    • le premier bloc contient les bits 110110 suivis des 10 bits de poids forts de U’

    • le second bloc contient les bits 110111 suivis des 10 bits de poids faibles de U’

Comme ce codage utilise 2 octets, il est sensible à l’architecture de la machine car il existe 2 manières de ranger les octets (l’ordre Big Endian et l’ordre Little Endian). Il y a 2 transformations UTF-16 (l’UTF-16-BE et l’UTF-16-LE) qui se différencient par des couples d’octets qui sont inversés l’un par rapport à l’autre.

Figure 1.21. Comparatif des tables Little Endian, big Endian UTF-16

Comparatif des tables Little Endian, big Endian UTF-16

Finalement le codage de l’UTF-16 peut être résumé par le tableau ci-dessous (nous posons 0000eeee = bbbbbbbb - 1 où 0000eeee représente les 8 bits de poids fort de U’ et bbbbbbbb représente les 8 bits de poids fort de U) :

Figure 1.22. Comparatif des tables Little Endian, big Endian UTF-16

Comparatif des tables Little Endian, big Endian UTF-16

Lors d’une transmission, il faut ajouter un "Byte Order Mark" au début de chaîne afin d’indiquer dans quel mode nous nous trouvons. Pour cela, nous avons choisi de placer le caractère "Zero-Width No-Break Space" qui selon la manière dont il est codé permet de déterminer dans quel mode nous nous trouvons :

  • FF FE en little endian.

  • FE FF en big endian.

Par exemple, nous pouvons coder A et à en UTF-16 :

Table 1.2. Table UTF-16 POUR A et à

Caractère Unicode Décimal caractère Codage binaire UTF-16 Codage hexadécimal UTF-16
A 10 0000 0000 0000 1010 000A
à 224 0000 0000 1110 0000 00E0


Pour l’UTF-32, cette transformation consiste à transformer le code des caractères de la table UCS en une ou plusieurs valeurs codées sur 32 bits. Cependant ce code est peu utilisé car il est coûteux : il occupe 4 octets en mémoire alors que 2 octets sont suffisants pour les caractères du plan multilingue de base. Il peut devenir utile pour manipuler des caractères se trouvant en dehors du PMB comme les hiéroglyphes par exemple.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels