%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Encodage/Encodage|Accueil · Encodage]] > > | [[Code et Développement/Programmation/Encodage/01_Encodage ASCII\|← Encodage ASCII]] | [[Code et Développement/Programmation/Encodage/03_Modèle RVB\|Modèle RVB →]] | > |:---|---:| %% nav-fin %% # Chapitre 2 : L’Encodage UTF-8 ## Introduction Un ordinateur ne manipule que des 0 et des 1. Ce chapitre explique comment il représente des caractères comme 'A', 'é', '€' ou '😊'. Les premiers systèmes utilisaient des encodages limités, comme l’ASCII, qui ne représentent qu’une petite partie des caractères. Les échanges entre pays ont exigé un système capable de représenter toutes les langues et tous les symboles. Unicode et l’encodage **UTF-8** répondent à ce besoin. Ce chapitre présente le fonctionnement d’UTF-8 et explique pourquoi il est devenu l’encodage de texte dominant sur Internet. --- ## 1. Rappels sur l’Encodage et les Systèmes de Numération Cette section rappelle les notions utiles pour la suite du chapitre. > [!definition] Bit et Octet > Un **bit** (binary digit) est la plus petite unité d’information en informatique, représentant un 0 ou un 1. > Un **octet** (byte) est un groupe de 8 bits. Un octet peut représenter $2^8 = 256$ valeurs différentes (de 0 à 255). Les ordinateurs stockent et manipulent des données sous forme binaire. Pour représenter du texte, il faut donc associer un nombre unique à chaque caractère. C’est le rôle des **jeux de caractères** et des **encodages**. ### 1.1. ASCII : Le Premier Standard Le jeu de caractères **ASCII** (American Standard Code for Information Interchange) a été l’un des premiers standards largement adoptés. > [!definition] ASCII > L’ASCII est un jeu de caractères qui utilise 7 bits pour représenter 128 caractères. Cela inclut les lettres majuscules et minuscules de l’alphabet latin non accentué, les chiffres, les symboles de ponctuation et quelques caractères de contrôle. Par exemple : - 'A' est représenté par le code décimal 65, soit $01000001_2$ en binaire. - 'a' est représenté par le code décimal 97, soit $01100001_2$ en binaire. - ' ' (espace) est représenté par le code décimal 32, soit $00100000_2$ en binaire. > [!note] Limites de l’ASCII > L’ASCII suffit pour l’anglais. Il ne représente pas les caractères accentués (é, à, ç), les symboles monétaires (€, £) ni les alphabets non latins (cyrillique, arabe, chinois, etc.). ### 1.2. Extension de l’ASCII : Les Jeux de Caractères sur 8 bits Pour pallier les limites de l’ASCII, divers encodages sur 8 bits ont été développés, utilisant le 8ème bit pour étendre le répertoire à 256 caractères. > [!example] ISO-8859-1 (Latin-1) > L'**ISO-8859-1**, aussi connu sous le nom de **Latin-1**, est un encodage qui étend l’ASCII en utilisant les codes de 128 à 255 pour inclure la plupart des caractères des langues d’Europe de l’Ouest (français, allemand, espagnol, etc.). > - 'é' est représenté par le code décimal 233, soit $11101001_2$ en binaire. > - '€' n’est *pas* inclus dans l’ISO-8859-1. > [!warning] Problème des Encodages Multiples > Le problème majeur avec ces extensions est qu’il en existait de nombreuses, souvent incompatibles entre elles (ISO-8859-2 pour l’Europe de l’Est, KOI8-R pour le russe, Big5 pour le chinois traditionnel, etc.). Un même octet pouvait représenter un caractère différent selon l’encodage utilisé, menant à des "caractères corrompus" (mojibake) si l’encodage n’était pas correctement spécifié. --- ## 2. Unicode : Le Répertoire Universel de Caractères **Unicode** a été créé pour remplacer ces encodages incompatibles par un standard unique. > [!definition] Unicode > **Unicode** est un standard international qui vise à attribuer un numéro unique (appelé **point de code** ou **code point**) à chaque caractère, quelle que soit la plateforme, le programme ou la langue. Ce n’est *pas* un encodage, mais un vaste répertoire de caractères. Chaque point de code Unicode est généralement représenté par la notation `U+XXXX`, où `XXXX` est la valeur hexadécimale du point de code. > [!example] Exemples de Points de Code Unicode > - 'A' : `U+0041` (identique à l’ASCII) > - 'é' : `U+00E9` (identique à l’ISO-8859-1) > - '€' : `U+20AC` > - '😊' : `U+1F60A` (un emoji) > - '你好' (Ni hao) : `U+4F60` (你) et `U+597D` (好) Le répertoire Unicode est immense. Il est structuré en "plans" : - Le **Plan Multilingue de Base (BMP)**, ou Plan 0, couvre les points de code de `U+0000` à `U+FFFF`. Il contient la plupart des caractères couramment utilisés pour les langues modernes. - Les **Plans Supplémentaires** (Plan 1 à 16) couvrent les points de code au-delà de `U+FFFF`, jusqu’à `U+10FFFF`. Ils contiennent des caractères moins fréquents, des symboles historiques, des emojis, etc. Le nombre total de points de code possibles dans Unicode est de $2^{20} + 2^{16} = 1\ 114\ 112$ (environ 1,1 million). > [!note] Unicode n’est pas un Encodage > Unicode attribue des numéros. Il ne fixe pas la façon de stocker ou de transmettre ces numéros en octets. C’est le rôle des **encodages Unicode**, tels que UTF-8, UTF-16 et UTF-32. --- ## 3. UTF-8 : L’Encodage Dominant **UTF-8** (Unicode Transformation Format - 8-bit) est l’encodage Unicode le plus utilisé, notamment sur le web. UTF-8 répond à quatre exigences : 1. **Compatibilité ASCII** : Les 128 premiers caractères d’Unicode (ceux de l’ASCII) sont encodés sur un seul octet en UTF-8, et cet octet est *identique* à leur représentation ASCII. Cela signifie qu’un texte purement ASCII est aussi un texte UTF-8 valide. 2. **Longueur Variable** : UTF-8 utilise 1 à 4 octets pour représenter un point de code Unicode. Les caractères les plus fréquents (ASCII) utilisent 1 octet, ceux du BMP (hors ASCII) 2 ou 3 octets, et les caractères des plans supplémentaires 4 octets. 3. **Universalité** : Il peut représenter *tous* les points de code Unicode, sans exception. 4. **Efficacité** : Pour les textes majoritairement latins (comme le français), l’UTF-8 est souvent plus compact que d’autres encodages Unicode comme UTF-16, car il utilise moins d’octets pour les caractères fréquents. > [!tip] UTF-8 et le Web > Plus de 97% des sites web utilisent UTF-8 comme encodage de caractères. C’est le standard de facto pour l’interopérabilité textuelle sur Internet. ### 3.1. Les règles d’encodage Le nombre d’octets dépend du point de code du caractère. | Points de code | Octets | Motif binaire | Bits disponibles | |---|---|---|---| | `U+0000` à `U+007F` | 1 | `0xxxxxxx` | 7 | | `U+0080` à `U+07FF` | 2 | `110xxxxx 10xxxxxx` | 11 | | `U+0800` à `U+FFFF` | 3 | `1110xxxx 10xxxxxx 10xxxxxx` | 16 | | `U+10000` à `U+10FFFF` | 4 | `11110xxx 10xxxxxx 10xxxxxx 10xxxxxx` | 21 | - Le premier octet commence par autant de 1 que le caractère compte d’octets, suivis d’un 0. Un caractère sur 1 octet commence par 0. - Chaque octet suivant commence par `10`. - Les bits du point de code remplacent les `x`, de gauche à droite. On complète à gauche par des 0. > [!example] Encoder 'é' > - 'é' a pour point de code `U+00E9`, soit 233 en décimal. > - 233 est compris entre `U+0080` et `U+07FF` : il faut 2 octets et 11 bits. > - 233 sur 11 bits : `00011 101001`. > - Premier octet : `110` suivi de `00011`, soit `11000011`. > - Second octet : `10` suivi de `101001`, soit `10101001`. > > 'é' s’écrit donc `11000011 10101001` en UTF-8, soit `C3 A9` en hexadécimal. > > Avec la même méthode, '€' (`U+20AC`) s’écrit sur 3 octets : `E2 82 AC`. **À manipuler :** tapez un texte avec des accents et comptez les octets. ```sq-utf8 texte: Été à Noël ``` ## Conclusion UTF-8 est l’encodage de texte standard. Il est compatible avec l’ASCII, il représente tous les caractères Unicode et il reste compact pour les textes en alphabet latin. %% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Encodage/Encodage|Accueil · Encodage]] > > | [[Code et Développement/Programmation/Encodage/01_Encodage ASCII\|← Encodage ASCII]] | [[Code et Développement/Programmation/Encodage/03_Modèle RVB\|Modèle RVB →]] | > |:---|---:| %% nav-fin %% --- 🗓️ Historique Dernière mise à jour : `8 novembre 2026` Rédigé par : [[Julien DUQUENNOY]]