Aller au contenu

Encodage de caractères

L'encodage de caractères est le processus qui consiste à représenter des caractères, des symboles ou des textes sous forme de nombres binaires, afin qu'ils puissent être stockés, transmis et interprétés par les ordinateurs.

Autrement dit, c'est la traduction du langage humain en langage machine.

L'objectif est de permettre à des systèmes différents de lire, afficher et échanger du texte de manière cohérente.

Premiers systèmes d'encodage

Avant l'informatique, plusieurs systèmes ont permis de convertir des messages en signaux codés pour faciliter leur transmission à distance.

Télégraphe Chappe (1794)

Inventé par les frères Chappe, ce système de communication optique utilisait des bras mécaniques montés sur des tours.

Chaque position correspondait à une lettre, un chiffre ou un mot.

Les messages pouvaient être relayés de tour en tour, permettant de communiquer sur plusieurs centaines de kilomètres.

Source : Encyclopedia Britannica - Claude Chappe

chappe-telegraph.png

Source image

Code Morse (1838)

Créé par Samuel Morse et son collaborateur Alfred Vail, ce code représente chaque lettre ou chiffre par une combinaison de points et de tirets.

Il a permis les premières transmissions électriques rapides via le télégraphe, avant d'être utilisé dans la radio et la marine.

Une version modifiée, le code Morse international, est devenue la norme mondiale. Elle est aujourd'hui définie par l'UIT (Union internationale des télécommunications).

Sources :

morse-code.png

Source image

Code international des signaux (1855)

En navigation, ce système utilise des drapeaux colorés pour représenter des lettres et des messages standardisés.

Il permet aux navires de communiquer indépendamment de la langue parlée, notamment pour signaler des situations d'urgence.

Source : Wikipedia - Code international des signaux

ics-flags.png

Source image

ASCII

L'ASCII (American Standard Code for Information Interchange), publié en 1963, est le premier standard informatique majeur pour représenter du texte.

  • Chaque caractère (lettre, chiffre ou symbole) reçoit une valeur numérique entre 0 et 127.
  • Les caractères sont codés sur 7 bits, ce qui permet de représenter 128 caractères possibles.
  • Il inclut aussi des caractères de contrôle, qui ne s'affichent pas mais commandent la mise en forme (comme le saut de ligne, noté \n dans de nombreux langages de programmation, ou la tabulation, notée \t).

Source : ETHW (IEEE) - Milestones: American Standard Code for Information Interchange ASCII, 1963

ascii.png

Source image

ASCII étendu

Dans les années 1980, avec la diffusion des ordinateurs dans des pays de langues différentes, plusieurs extensions à 8 bits (256 caractères) ont été créées. On les regroupe sous le nom d'« ASCII étendu ».

Les 128 valeurs supplémentaires permettent d'ajouter des lettres accentuées, des symboles et des caractères régionaux.

  • Exemples : ISO 8859-1 pour l'Europe de l'Ouest, ISO 8859-5 pour le cyrillique.
  • Ces extensions varient selon les régions, d'où la nécessité de gérer des « code pages ».

Note

Une code page est une table de correspondance utilisée par les systèmes d'exploitation et les logiciels pour relier les valeurs numériques (codes) aux caractères affichés.

Chaque code page définit son propre jeu de caractères, ce qui permet d'adapter l'affichage du texte à une langue ou une région donnée.

ISO 8859-1 (Latin alphabet No. 1)

iso-8859-1.png

Source image

ISO 8859-5 (Latin/Cyrillic alphabet)

iso-8859-5.png

Source image

Problématique des code pages

L'inconvénient majeur des code pages est qu'elles ne sont pas universelles : chaque région ou langue possède sa propre table d'encodage.

Ainsi, le même nombre binaire peut représenter des caractères différents selon la code page utilisée.

Cela entraînait des problèmes d'affichage lorsqu'un texte était lu avec un encodage incorrect, phénomène connu sous le nom de mojibake (文字化け, littéralement « caractères transformés » en japonais).

Exemple concret :

  • Une page encodée en ISO 8859-1 s'affichera mal si le navigateur l'interprète comme ISO 8859-5 (cyrillique).

Encodage ISO 8859-1

20min-iso-8859-1.png

Encodage ISO 8859-5

20min-iso-8859-5.png

Caractères et encodage

Tous les caractères ne sont pas disponibles dans chaque code page, et un même caractère n'a pas forcément le même code d'une page à l'autre. Ce morcellement a rendu difficile la communication entre systèmes utilisant des langues différentes, d'où la création de la norme Unicode.

character-encoding.png

Source image

Unicode

Pour résoudre ces problèmes, le consortium Unicode a publié en 1991 (version 1.0, octobre 1991) une norme universelle : chaque caractère de toutes les langues reçoit un identifiant unique, appelé code point.

Unicode vise à unifier tous les systèmes d'écriture, symboles, émojis et signes techniques dans une seule table mondiale.

Exemple :

  • Lettre A → U+0041
  • Emoji 😄 → U+1F604

Sources :

UTF-8

UTF-8 (Unicode Transformation Format - 8 bits) est un format d'encodage pour les caractères Unicode. Conçu en 1992 par Ken Thompson et Rob Pike, il permet de stocker chaque caractère avec 1 à 4 octets, selon la valeur de son code point.

  • U+0000 à U+007F (caractères ASCII) : 1 octet → un texte ASCII est aussi un texte UTF-8 valide (rétrocompatibilité)
  • U+0080 à U+07FF (lettres accentuées, alphabets grec, cyrillique, arabe, hébreu…) : 2 octets
  • U+0800 à U+FFFF (la plupart des autres écritures, dont le chinois et le japonais, et des symboles comme €) : 3 octets
  • U+10000 à U+10FFFF (la plupart des emojis, écritures historiques) : 4 octets

Sources :

utf-8-conversion.png

Source image

C'est aujourd'hui l'encodage standard du web : 99.1 % des sites web dont l'encodage est connu l'utilisent.

encoding-stats.png

Source image

encoding-evolution.png

Source image

Unicode ≠ UTF-8

Unicode : norme définissant tous les caractères et leurs identifiants (code points).

UTF-8 : méthode concrète pour stocker ces identifiants sous forme binaire.

Terminologie essentielle

Character (caractère) : Unité minimale de texte, abstraite (la lettre « a » en tant que telle). À ne pas confondre avec le glyphe, qui est sa forme dessinée par une police.

Character set (jeu de caractères) : Ensemble de caractères disponibles.

Coded character set (jeu de caractères codés) : Ensemble où chaque caractère a un identifiant unique.

Code point (point de code) : Identifiant numérique d'un caractère, noté U+ suivi de 4 à 6 chiffres hexadécimaux (de U+0000 à U+10FFFF).

Code unit (unité de code) : Plus petite séquence de bits manipulée par un encodage : 8 bits en UTF-8, 16 bits en UTF-16. Un caractère peut nécessiter plusieurs unités de code (de 1 à 4 en UTF-8).

Encoding (encodage) : Conversion des caractères en binaire pour stockage ou transmission.

Source : Unicode - Glossary of Unicode Terms

character-encoding-workflow.png

Fonctionnement Unicode et affichage

Voici les principales étapes qui permettent à un simple code binaire d'être transformé en caractère visible à l'écran :

  1. Bits en mémoire (Code binaire)

    • Le texte est stocké sous forme de suites de bits (0 et 1).
    • Par exemple, le caractère a est enregistré comme la séquence binaire suivante 01100001.
    • Ces bits représentent une unité de code (code unit) selon un encodage (ici UTF-8).
  2. Décodage de l'encodage (UTF-8 → Unicode)

    • Le système lit la séquence binaire selon les règles de l'encodage UTF-8.
    • Il identifie qu'il s'agit d'un seul octet valide et le convertit en code point Unicode U+0061.
    • Ce code point correspond à la lettre latine minuscule a dans la norme Unicode.
  3. Correspondance avec un glyphe (mapping police de caractères)

    • Le système d'exploitation ou le moteur de rendu (par ex. FreeType, DirectWrite, Core Text, etc.) recherche dans la police de caractères active le glyphe correspondant à U+0061.
    • Un glyphe est la représentation graphique du caractère (sa forme visuelle).
  4. Chargement et rendu du glyphe

    • Le moteur de rendu lit les données vectorielles ou bitmap du glyphe (formes, contours, proportions).
    • Il applique éventuellement un lissage des contours (antialiasing ou anticrénelage), un ajustement des contours à la grille de pixels (hinting) ou un rendu sous-pixel (subpixel rendering) pour améliorer la lisibilité à l'écran.
  5. Affichage à l'écran (rasterisation)

    • Le glyphe final est rendu en pixels par la carte graphique (GPU) ou le processeur.
    • Le pixel buffer est ensuite envoyé à l'écran, où le caractère a apparaît sous la forme visible que l'on connait.

character-encoding-unicode-workflow.png

Source image

Unicode aujourd'hui

Unicode 18.0 contient actuellement : 172 808 caractères [septembre 2026]

Source : Unicode - Unicode 18.0.0

unicode-c0.png

unicode-c1.png

unicode-emoticon.png

Source images

Glyphes manquants

unicode-missing-Anatolian-Hieroglyphs.png

Source image

drawing-question-mark.png

Si un caractère n'est pas affiché (souvent remplacé par un carré ou un '?'), c'est que la police utilisée ne contient pas le glyphe correspondant.

Vous devez posséder une police de caractères avec les glyphes !

➡️ Police de caractères Noto

unicode-Anatolian-Hieroglyphs.png