Encodage ASCII et UTF-8

Les ordinateurs ne comprennent que le binaire (0 et 1), tandis que les humains utilisent des caractères. Pour qu'un texte puisse être stocké, affiché ou transmis par une machine, chaque caractère doit être associé à un nombre, puis converti en binaire : c’est ce qu’on appelle l'encodage de caractères. Ce processus est indispensable pour assurer une bonne communication entre les machines et les utilisateurs.


II. Rappels : Binaire, Hexadécimale et Octets

A. Le système binaire

Les ordinateurs utilisent un système de numération appelé binaire, basé uniquement sur deux chiffres : 0 et 1.

Chaque chiffre binaire s'appelle un bit (binary digit).

Comparaison avec le système décimal

Position dans un nombre Valeur en base 10 Valeur en base 2
unités 10⁰ = 1 2⁰ = 1
dizaines 10¹ = 10 2¹ = 2
centaines 10² = 100 2² = 4
milliers 10³ = 1000 2³ = 8
etc. ... ...

Dans le système binaire, chaque position représente une puissance de 2.

Exemple : conversion décimal → binaire

Prenons le nombre 13.

On cherche les puissances de 2 qui le composent :

  • 13 = 8 + 4 + 1 → 2³ + 2² + 2⁰

  • On place un 1 dans les positions correspondantes, et 0 ailleurs :
    13₁₀ = 1101₂

Autres exemples utiles :

Décimal Binaire
0 0
1 1
2 10
65 1000001
255 11111111

B. Le bit et l’octet

1. Définition

  • Un bit est la plus petite unité d’information : 0 ou 1.
  • Un octet est un groupe de 8 bits.

Exemple : 01000001 est un octet.

2. Capacité d’un octet

Avec 8 bits, on peut représenter :
- 2⁸ = 256 valeurs différentes, de 0 à 255.
- C’est pourquoi l’encodage des caractères (ASCII, UTF-8…) utilise souvent des octets.

C. Représentation des caractères sur un octet

Si on veut encoder un caractère dans un octet, cela signifie qu’on lui associe un nombre entre 0 et 255, qui sera ensuite converti en binaire.

Par exemple :
- Le caractère 'A' peut être représenté par 65, soit 01000001 en binaire.
- Le caractère 'a' par 97, soit 01100001.

Ce genre d'association est normalisée dans des tables d'encodage, comme ASCII ou Unicode.

D. Le système hexadécimal (base 16)

  • Il est souvent utilisé pour représenter les octets de façon plus lisible.
  • Un chiffre hexadécimal peut représenter 4 bits (demi-octet ou nibble).
  • 1 octet = 8 bits = 2 chiffres hexadécimaux.
Binaire Hexadécimal Décimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

Conversion du binaire en hexadécimal

Pour convertir un nombre binaire en hexadécimal :

  1. On découpe le nombre binaire en groupes de 4 bits en partant de la droite. S’il manque des bits à gauche, on ajoute des zéros.
  2. On convertit chaque groupe de 4 bits en chiffre hexadécimal à l’aide du tableau.
  3. On assemble les chiffres hexadécimaux.

Exemples :

  • 110010101100 1010C ACA
  • 1011010010 1101 (on complète à gauche) → 2 D2D

Conversion de l’hexadécimal en binaire

Pour convertir un nombre hexadécimal en binaire :

  1. On prend chaque chiffre hexadécimal individuellement.
  2. On le remplace par son équivalent en 4 bits binaires à l’aide du tableau.
  3. On assemble les groupes de 4 bits pour retrouver le nombre binaire complet.

Exemples :

  • 4F4 = 0100, F = 111101001111
  • A3A = 1010, 3 = 001110100011

L’hexadécimal est souvent utilisé dans :

  • le codage des couleurs en HTML (ex : #FF0000 pour du rouge)
  • les tableaux ASCII (valeurs hexadécimales des caractères)
  • les éditeurs hexadécimaux et les fichiers binaires

III. Encodage ASCII (standard, 7 bits)

A. Historique et objectif

L’ASCII (prononcé “aski”) est l’acronyme de American Standard Code for Information Interchange. Il s’agit d’un standard américain créé dans les années 1960, qui visait à établir une correspondance univoque entre les caractères lisibles (lettres, chiffres, ponctuation) et des valeurs numériques. Il fut largement utilisé dans les premiers ordinateurs, télétypes, imprimantes, systèmes d'exploitations, etc., et reste le socle de nombreux encodages modernes.

B. Principe de fonctionnement

L’encodage ASCII repose sur l’utilisation de 7 bits par caractère, soit un total de 128 caractères possibles (de 0 à 127 en décimal). Les 128 codes ASCII sont divisés en deux grandes catégories :

  1. Les caractères de contrôle (valeurs 0 à 31 et 127)
    → non imprimables, ils servent à contrôler les flux de données.
    Exemples : retour chariot, tabulation, effacement, etc.

  2. Les caractères imprimables (valeurs 32 à 126)
    → lettres, chiffres, ponctuation, symboles.
    Exemples : A, Z, a, z, 0–9, +, -, !, $, etc.

C. Exemples courants

Caractère Code décimal Binaire
'A' 65 01000001
'B' 66 01000010
'a' 97 01100001
'0' 48 00110000
' ' (espace) 32 00100000
'\n' (saut de ligne) 10 00001010

On remarque que :
- Les lettres majuscules vont de 65 à 90.
- Les lettres minuscules vont de 97 à 122.
- Les chiffres vont de 48 à 57.

D. Représentation mémoire

Lorsqu’un texte comme "Hello" est encodé en ASCII, chaque lettre est transformée en un octet (le 8e bit est à 0 ou ignoré).
Voici ce que cela donne : 72 101 108 108 111 soit 01001000 01001000 01101100 01101100 01101111

Le mot Hello occupe donc 5 octets en mémoire.

E. Tableau ASCII

Tableau ASCII

F. Intérêt et limites

L’ASCII est simple, universel dans les débuts de l’informatique, et compatible avec de nombreux systèmes.

Mais il a une limite majeure : il ne permet pas d’écrire dans d’autres langues que l’anglais.
→ Aucun accent, aucune lettre avec cédille, aucun caractère grec, arabe, chinois, etc.

C’est ce qui a motivé, par la suite, la création d’extensions et d’encodages plus riches.


IV. ASCII étendu (8 bits)

A. Pourquoi un ASCII étendu ?

L'ASCII standard (7 bits) ne permet d'encoder que 128 caractères.
Cela suffit pour l'alphabet anglais, mais pas pour de nombreuses langues, y compris le français, qui utilise :

  • les lettres accentuées : é, è, à, ê, î...
  • la cédille : ç
  • des symboles supplémentaires : €, œ, « », etc.

Les utilisateurs et les fabricants de logiciels ont donc développé des versions étendues d'ASCII, utilisant 8 bits (soit 256 valeurs possibles) pour ajouter des caractères supplémentaires tout en conservant les 128 premiers caractères inchangés.

B. Comment fonctionne l’ASCII étendu ?

  • On garde les codes 0 à 127 inchangés (identiques à l’ASCII standard).
  • On utilise les codes 128 à 255 pour ajouter de nouveaux caractères.
  • Un seul octet est toujours utilisé par caractère.

Mais chaque pays, système d’exploitation ou logiciel a pu définir sa propre table d’extension. Il n’existe donc pas un ASCII étendu, mais plusieurs variantes.

C. Quelques encodages courants d’ASCII étendu

Nom de l'encodage Description
ISO 8859-1 Aussi appelé Latin-1, utilisé en Europe de l'Ouest.
Windows-1252 Variante de Latin-1 utilisée sous Windows.
ISO 8859-15 Ajoute l'euro (€), œ, etc.
Mac Roman Encodage historique sur Macintosh.
IBM PC (code page 437) Ancien encodage pour DOS.

D. Exemple pour le français (ISO 8859-1)

Caractère Code décimal Code hexadécimal Binaire
é 233 E9 11101001
à 224 E0 11100000
ç 231 E7 11100111
è 232 E8 11101000
ê 234 EA 11101010
« 171 AB 10101011
» 187 BB 10111011

E. Problèmes liés à l’ASCII étendu

  1. Pas de standard unique :
    Un même octet (par exemple 0xE9) peut désigner :

    • é en ISO 8859-1,
    • un autre caractère en Windows-1251 (cyrillique),
    • ou même rien du tout dans d'autres encodages.
  2. Incompatibilités fréquentes :
    En ouvrant un fichier texte enregistré dans un encodage avec un autre éditeur, on voit parfois des caractères illisibles (appelés "mojibake").

  3. Impossibilité d’internationaliser les textes :
    On ne peut pas mélanger dans un même fichier des caractères latins, grecs, chinois, etc.

F. Transition vers Unicode

Les limites de l’ASCII étendu ont conduit à la création du standard Unicode, destiné à encoder tous les caractères de toutes les langues dans un système universel et sans ambiguïté.

L’encodage UTF-8, que nous verrons ensuite, est basé sur Unicode mais reste compatible avec ASCII.


V. Limites de l'ASCII étendu et naissance d'Unicode

A. Rappel des limites de l'ASCII étendu

L’ASCII étendu a permis une première internationalisation des textes, mais avec de nombreuses limites :

  1. Pas de standard unique

    • Chaque pays, système ou éditeur a défini sa propre version de l’ASCII étendu.
    • Un même fichier peut s'afficher différemment selon l'encodage utilisé.
  2. Nombre de caractères limité à 256

    • Impossible d’encoder simultanément des caractères français, grecs, russes, arabes, chinois, etc.
    • Inadapté aux langues non latines ou aux systèmes multilingues.
  3. Problèmes d’interopérabilité

    • Échange de fichiers entre systèmes (Windows ↔ Linux, ou entre navigateurs, éditeurs de texte) entraîne souvent des erreurs d'affichage : les fameux caractères illisibles ou symboles remplacés.

Exemple : un fichier encodé en ISO 8859-1 affiché comme s’il était en UTF-8 montrera des « â© » ou « é » au lieu de « é ».

B. Besoin d’un encodage universel

Face à cette fragmentation, il est apparu nécessaire de :
- Créer une table unique de tous les caractères du monde (latin, grec, cyrillique, arabe, chinois, emoji, symboles mathématiques…).
- Proposer un encodage capable de gérer l’ensemble de ces caractères.
- Assurer la compatibilité avec ASCII (pour les anciens fichiers et systèmes).

C’est ainsi qu’est né Unicode.

C. Qu’est-ce que Unicode ?

Unicode est une norme universelle d’encodage de caractères.
Elle associe à chaque caractère un numéro unique appelé point de code (ou code point).

Exemple :
- 'A' → U+0041
- 'é' → U+00E9
- '你' (ni, en chinois) → U+4F60
- '😀' (emoji) → U+1F600

Unicode n’est pas un format de stockage en soi, mais un répertoire de tous les caractères existants, chacun identifié par un point de code.

D. Encodages Unicode

Pour stocker ces points de code en mémoire ou dans des fichiers, il faut les encoder : c’est le rôle de formats comme :

  • UTF-8 (le plus utilisé dans le monde)
  • UTF-16
  • UTF-32

  • UTF-8 a été créé en 1993, après UTF-16, par Ken Thompson et Rob Pike. Il a été conçu pour être compatible avec les systèmes Unix, qui utilisent des chaînes de texte terminées par un octet nul (\0). UTF-8 est plus flexible pour les anciens logiciels, car il évite les octets nuls dans les caractères ASCII.

Le plus courant, et celui que nous allons voir en détail, est UTF-8, car il combine universalité, efficacité et compatibilité avec ASCII.

E. Pourquoi UTF-8 a-t-il été adopté ?

  1. Compatible avec l’ASCII

    • Les 128 premiers caractères ASCII (valeurs 0 à 127) sont identiques en UTF-8.
  2. Stockage flexible

    • Chaque caractère est codé sur 1 à 4 octets selon sa complexité.
    • Cela économise de la place pour les textes simples (en anglais par exemple).
  3. Universel

    • Capable d’encoder plus d’un million de caractères.
    • Adapté à toutes les langues du monde, y compris les emojis modernes.
  4. Fiable et robuste

    • Facile à détecter si l’encodage est incorrect (pas de mélange ambigu).
    • Norme dominante sur le Web, dans les bases de données, et dans les systèmes modernes.

Au 12 mai 2025, la dernière version officielle du standard Unicode est la version 16.0, publiée en septembre 2024. Cette version comprend un total de 154 998 caractères .


VI. Encodage UTF-8

A. Rappel : UTF-8 encode Unicode

  • Unicode attribue à chaque caractère un point de code unique (ex. U+00E9 pour « é »).
  • UTF-8 est un format de codage de ces points de code en octets (1 à 4).

B. Principe de l’encodage UTF-8

UTF-8 utilise un nombre variable d’octets par caractère :

Octets Plage Unicode Exemple
1 U+0000 à U+007F ASCII : A, Z, 0...
2 U+0080 à U+07FF é, à, ç...
3 U+0800 à U+FFFF ह (hindi), ש (hébreu)
4 U+10000 à U+10FFFF 𐍈, 😀 (emoji)

Avantage : plus un caractère est courant, moins il prend de place.
Les textes simples (anglais) sont compacts, tandis que les langues complexes restent possibles.

C. Structure binaire des octets UTF-8

Voici le schéma de codage pour chaque type :

Nombre d’octets Schéma binaire Bits utiles (x)
1 octet 0xxxxxxx 7 bits (ASCII standard)
2 octets 110xxxxx 10xxxxxx 11 bits
3 octets 1110xxxx 10xxxxxx 10xxxxxx 16 bits
4 octets 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 21 bits

Chaque octet :
- Commence par une séquence de bits fixes (ex. 110 ou 1110) indiquant la longueur.
- Suit avec des bits utiles (marqués x) contenant le code binaire du caractère.

Les octets suivants (s’ils existent) commencent toujours par 10.

L'encodage UTF-8 peut représenter jusqu’à 1 112 064 caractères différents.

D. Exemples d’encodage

1. Caractère ASCII : A

  • Unicode : U+0041
  • Binaire : 00001000 00000001 → 7 bits : 01000001
  • UTF-8 : 1 octet 01000001 (0x41)

2. Caractère français : é

  • Unicode : U+00E9 → 00000000 11101001
  • Binaire utile : 11101001 → 2 octets UTF-8

Découpage :
- 11 bits : 11101001 → on code en 2 octets :
- 11000011 (0xC3)
- 10101001 (0xA9)

UTF-8 de « é » = C3 A9

3. Caractère chinois :

  • Unicode : U+4F60
  • Binaire : 01001111 01100000 → 16 bits
  • On code en 3 octets :
    • 11100100 (0xE4)
    • 10111101 (0xBD)
    • 10100000 (0xA0)

UTF-8 de « 你 » = E4 BD A0

4. Emoji 😀 (visage souriant)

  • Unicode : U+1F600 → binaire 0001 1111 0110 0000 0000
  • Encodage UTF-8 (4 octets) :
    • 11110000 (0xF0)
    • 10011111 (0x9F)
    • 10011000 (0x98)
    • 10000000 (0x80)

UTF-8 de 😀 = F0 9F 98 80

E. Lecture d’un fichier UTF-8

Pour lire un texte UTF-8 :
1. On lit les octets un à un.
2. Le premier octet indique combien d’octets forment le caractère.
3. On recompose le point de code, puis on l’affiche.

F. Avantages de UTF-8

  • Compatible avec ASCII (les fichiers ASCII sont valides en UTF-8).
  • Efficace pour les langues occidentales (1 ou 2 octets suffisent).
  • Universel : couvre tous les alphabets, les symboles, les emojis, etc.
  • Robuste : erreurs de lecture détectables.
  • Adopté partout : sur le web, dans les bases de données, dans les systèmes modernes.