Encodage de texte expliqué : UTF-8, ASCII, Unicode et jeux de caractères
· 12 min de lecture
Table des matières
- Qu'est-ce que l'encodage de caractères ?
- ASCII : Les fondations de l'encodage de texte
- Unicode : Un jeu de caractères universel
- UTF-8 : L'encodage standard d'Internet
- UTF-8 vs UTF-16 vs UTF-32 : Choisir le bon encodage
- Mojibake et problèmes d'encodage
- Encodage en HTML et développement web
- Encodage dans les langages de programmation
- Encodage Base64 : Données binaires en texte
- Bonnes pratiques et pièges courants
- Questions fréquemment posées
- Articles connexes
Chaque fois que vous tapez un message, enregistrez un document ou naviguez sur un site web, l'encodage de caractères fonctionne en coulisses pour traduire le texte lisible par l'homme en données binaires que les ordinateurs comprennent. Bien qu'il soit fondamental pour toute communication numérique, l'encodage reste l'un des aspects les plus mal compris de l'informatique.
Ce guide complet explique tout ce que vous devez savoir sur l'encodage de texte, des bases de l'ASCII aux complexités d'Unicode et UTF-8. Que vous soyez un développeur déboguant des problèmes d'encodage ou simplement curieux de savoir comment les ordinateurs gèrent le texte, vous trouverez ici des informations pratiques et des solutions.
Qu'est-ce que l'encodage de caractères ?
L'encodage de caractères est le système qui associe des caractères—lettres, chiffres, symboles et caractères spéciaux—à des valeurs numériques que les ordinateurs peuvent stocker et traiter. Lorsque vous tapez la lettre « A » sur votre clavier, votre ordinateur ne stocke pas la lettre elle-même. Au lieu de cela, il stocke un nombre (en ASCII, c'est 65) et utilise le schéma d'encodage pour reconvertir ce nombre en « A » lors de l'affichage.
Considérez l'encodage de caractères comme un dictionnaire de traduction entre le langage humain et le langage informatique. Sans ce dictionnaire, le texte serait des séquences d'octets dénuées de sens sans aucun moyen de les interpréter correctement.
Le processus d'encodage fonctionne dans deux directions :
- Encodage : Conversion de caractères en octets (ce qui se passe lorsque vous enregistrez un fichier)
- Décodage : Conversion d'octets en caractères (ce qui se passe lorsque vous ouvrez un fichier)
Des problèmes surviennent lorsque l'encodage et le décodage utilisent des schémas différents. Imaginez si vous chiffriez un message avec un code et essayiez de le déchiffrer avec un autre—vous obtiendriez du charabia. La même chose se produit avec les incompatibilités d'encodage de texte, entraînant des caractères corrompus ou le fameux « mojibake » (nous y reviendrons plus tard).
Conseil : Utilisez notre outil Encodeur de texte pour voir exactement comment différents schémas d'encodage représentent le même texte. Cette approche pratique aide à démystifier le processus d'encodage.
ASCII : Les fondations de l'encodage de texte
ASCII (American Standard Code for Information Interchange) a été développé en 1963 et est devenu la base de l'encodage de texte moderne. Il utilise 7 bits pour représenter 128 caractères, ce qui était suffisant pour le texte anglais et les besoins informatiques de base de l'époque.
Le jeu de caractères ASCII est divisé en plusieurs plages, chacune servant un objectif spécifique :
| Plage | Caractères | Nombre | Objectif |
|---|---|---|---|
| 0-31 | Caractères de contrôle | 32 | Commandes non imprimables (tabulation, nouvelle ligne, retour chariot) |
| 32-47 | Ponctuation et symboles | 16 | Espace, !, ", #, $, %, &, ', (, ), *, +, virgule, -, ., / |
| 48-57 | Chiffres | 10 | 0-9 |
| 58-64 | Ponctuation | 7 | :, ;, <, =, >, ?, @ |
| 65-90 | Lettres majuscules | 26 | A-Z |
| 91-96 | Ponctuation | 6 | [, \, ], ^, _, ` |
| 97-122 | Lettres minuscules | 26 | a-z |
| 123-126 | Ponctuation | 4 | {, |, }, ~ |
| 127 | Supprimer | 1 | Caractère de contrôle DEL |
Les limites de l'ASCII
ASCII fonctionne parfaitement pour le texte anglais, mais il présente de sévères limitations pour la communication internationale :
- Pas de caractères accentués (é, ñ, ü, ø)
- Pas de caractères d'écritures non latines (chinois, arabe, hébreu, cyrillique)
- Pas de symboles monétaires au-delà du signe dollar
- Pas d'emoji ou de symboles modernes
- Pas de notation mathématique ou scientifique au-delà des opérateurs de base
Ces limitations ont conduit à la création de variantes « ASCII étendu » comme ISO-8859-1 (Latin-1), qui utilisait le 8e bit pour ajouter 128 caractères supplémentaires. Cependant, différentes régions ont créé des extensions incompatibles, faisant en sorte que les mêmes valeurs d'octets représentent différents caractères selon la page de code utilisée.
L'impact durable de l'ASCII
Malgré ses limitations, ASCII reste pertinent aujourd'hui. Les 128 premiers caractères d'UTF-8 (l'encodage moderne dominant) sont identiques à ASCII, assurant une rétrocompatibilité. Cela signifie que tout texte ASCII valide est également UTF-8 valide, rendant la migration transparente.
La simplicité de l'ASCII le rend également idéal pour les protocoles, formats de fichiers et systèmes où seul du texte anglais de base est nécessaire. Les langages de programmation, interfaces en ligne de commande et protocoles réseau s'appuient encore largement sur les caractères ASCII.
Unicode : Un jeu de caractères universel
Unicode a été créé en 1991 pour résoudre le problème fondamental que l'ASCII et ses extensions ne pouvaient pas résoudre : représenter tous les systèmes d'écriture du monde dans une norme unique et unifiée. Plutôt que d'avoir des dizaines de schémas d'encodage incompatibles, Unicode fournit un système qui fonctionne pour tout le monde.
Unicode n'est pas un encodage en soi—c'est un jeu de caractères qui attribue un nombre unique appelé point de code à chaque caractère. Depuis Unicode 15.1 (publié en 2023), la norme comprend plus de 149 000 caractères couvrant 161 écritures et ensembles de symboles.
Comprendre les points de code
Les points de code sont écrits au format U+XXXX, où XXXX est un nombre hexadécimal. Voici quelques exemples :
- U+0041 = A (lettre majuscule latine A)
- U+00E9 = é (lettre minuscule latine e avec accent aigu)
- U+4E2D = 中 (caractère chinois pour « milieu »)
- U+0628 = ب (lettre arabe beh)
- U+1F600 = 😀 (emoji visage souriant)
- U+03B1 = α (lettre minuscule grecque alpha)
L'espace de code Unicode va de U+0000 à U+10FFFF, offrant de la place pour 1 114 112 points de code possibles. Ceux-ci sont organisés en 17 plans de 65 536 points de code chacun.
Plans Unicode
Les plans les plus importants incluent :
- Plan 0 (BMP - Plan multilingue de base) : U+0000 à U+FFFF. Contient les caractères les plus couramment utilisés de toutes les écritures modernes, y compris le latin, le chinois, l'arabe, l'hébreu, le cyrillique et bien d'autres. Environ 55 000 points de code sont attribués dans ce plan.
- Plan 1 (SMP - Plan multilingue supplémentaire) : U+10000 à U+1FFFF. Contient des écritures historiques, notation musicale, symboles mathématiques et emoji. C'est là que vivent la plupart des emoji.
- Plan 2 (SIP - Plan idéographique supplémentaire) : U+20000 à U+2FFFF. Contient des idéogrammes chinois, japonais et coréens (CJK) supplémentaires qui ne rentraient pas dans le BMP.
- Plans 3-13 : Actuellement non attribués, réservés pour une expansion future.
- Plan 14 (SSP - Plan supplémentaire à usage spécial) : Contient des caractères à usage spécial comme les sélecteurs de variation et les balises.
- Plans 15-16 : Zones d'usage privé pour des caractères personnalisés.
Astuce rapide : Les caractères du BMP (Plan 0) peuvent être représentés avec 16 bits, tandis que les caractères d'autres plans nécessitent plus de bits. Cette distinction est importante lors du choix entre UTF-8, UTF-16 et UTF-32.
Normalisation Unicode
Une complexité d'Unicode est que certains caractères peuvent être représentés de plusieurs façons. Par exemple, le caractère « é » peut être encodé comme :
- Un seul point de code : U+00E9 (forme précomposée)
- Deux points de code : U+0065 (e) + U+0301 (accent aigu combinant)
Les deux représentations semblent identiques mais ont des séquences d'octets différentes. Les formes de normalisation Unicode (NFD, NFC, NFKD, NFKC) fournissent des moyens standard de convertir entre ces représentations, assurant une comparaison et une recherche cohérentes.
UTF-8 : L'encodage standard d'Internet
UTF-8 (Unicode Transformation Format - 8 bits) est l'encodage de caractères le plus largement utilisé sur Internet, représentant plus de 98 % de toutes les pages web. Il a été conçu par Ken Thompson et Rob Pike en 1992 et est devenu la norme de facto pour l'encodage de texte.
UTF-8 est un encodage à longueur variable qui utilise de 1 à 4 octets par caractère. Cette conception intelligente offre plusieurs avantages :
Comment fonctionne UTF-8
UTF-8 encode les caractères en utilisant le schéma suivant :
| Plage de points de code | Octets | Motif d'octets | Exemples de caractères |
|---|---|---|---|
| U+0000 à U+007F | 1 | 0xxxxxxx | Caractères ASCII (A, 5, $) |
| U+0080 à U+07FF | 2 | 110xxxxx 10xxxxxx | Latin étendu, grec, cyrillique (é, α, Ж) |
| U+0800 à U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx | La plupart des écritures asiatiques, symboles (中, ह, €) |
| U+10000 à U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | Emoji, écritures rares (😀, 𝕳, 𐐷) |
Les positions « x » dans les motifs d'octets contiennent les données réelles du caractère. Les bits de tête indiquent combien d'octets le caractère utilise, permettant aux décodeurs de se synchroniser correctement même s'ils commencent à lire en milieu de flux.
Avantages d'UTF-8
La domination d'UTF-8 provient de plusieurs avantages clés :
- Rétrocompatibilité : Le texte ASCII est UTF-8 valide sans aucune conversion. Les 128 premiers caractères utilisent des valeurs d'octets identiques.
- Efficacité d'espace : L'anglais et le code n'utilisent qu'1 octet par caractère, tout en supportant tous les caractères Unicode.
- Auto-synchronisation : Vous pouvez trouver les limites de caractères en regardant les motifs d'octets, facilitant la récupération d'erreurs.
- Pas de problèmes d'ordre d'octets : Contrairement à UTF-16 et UTF-32, UTF-8 ne nécessite pas de marque d'ordre d'octets (BOM) pour indiquer l'endianité.
- Sûr pour les octets nuls : L'octet nul (0x00) n'apparaît que comme caractère NULL, pas comme partie de séquences multi-octets, le rendant compatible avec les chaînes de style C.
UTF-8 en pratique
Voyons comment UTF-8 encode différents caractères :
- « A » (U+0041) : 1 octet →
0x41 - « é » (U+00E9) : 2 octets →
0xC3 0xA9 - « 中 » (U+4E2D) : 3 octets →
0xE4 0xB8 0xAD - « 😀 » (U+1F600) : 4 octets →
0xF0 0x9F 0x98 0x80
Cette approche à longueur variable signifie qu'un document contenant principalement du texte anglais utilise beaucoup moins d'espace qu'UTF-16 ou UTF-32, tout en supportant la gamme Unicode complète lorsque nécessaire.
Conseil : Spécifiez toujours l'encodage UTF-8 dans vos documents HTML avec <meta charset="UTF-8"> et dans les en-têtes HTTP avec Content-Type: text/html; charset=UTF-8. Cela empêche les navigateurs de deviner incorrectement l'encodage.
UTF-8 vs UTF-16 vs UTF-32 : Choisir le bon encodage
Bien qu'UTF-8 domine le contenu web, UTF-16 et UTF-32 ont leurs propres cas d'usage. Comprendre les différences vous aide à choisir le bon encodage pour vos besoins spécifiques.
UTF-16 : Le juste milieu
UTF-16 utilise 2 ou 4 octets par caractère. Les caractères du BMP (U+0000 à U+FFFF) utilisent 2 octets, tandis que les caractères en dehors du BMP utilisent 4 octets via un mécanisme appelé paires de substitution.
Avantages :
- Plus efficace en espace qu'UTF-8 pour les langues asiatiques (chinois, japonais, coréen)
- Utilisé en interne par Windows, Java, JavaScript et .NET
- Largeur constante de 2 octets pour la plupart des caractères courants simplifie certaines opérations sur les chaînes
Inconvénients :
- Pas rétrocompatible avec ASCII
- Nécessite une marque d'ordre d'octets (BOM) ou une spécification explicite de l'endianité
- Moins efficace en espace pour l'anglais et le code
- Encodage à longueur variable (en raison des paires de substitution) complique l'indexation des chaînes
- Contient des octets nuls dans le texte normal, cassant les fonctions de chaînes de style C
UTF-32 : Simplicité à largeur fixe
UTF-32 utilise exactement 4 octets pour chaque caractère, en faisant un encodage à largeur fixe. Chaque point de code correspond directement à un entier 32 bits.
Avantages :
- Largeur constante simplifie l'indexation des chaînes et les calculs de longueur
- Correspondance directe entre points de code et valeurs encodées
- Aucune logique de décodage complexe nécessaire
Inconvénients :
- Extrêmement inefficace en espace (4 octets par caractère, même pour ASCII)
- Rarement utilisé pour le stockage ou la transmission
- Pas rétrocompatible avec ASCII
- Nécessite une spécification de l'ordre d'octets
Tableau comparatif
| Fonctionnalité | UTF-8 | UTF-16 | UTF-32 |
|---|---|---|---|
| Octets par caractère | 1-4 (variable) | 2-4 (variable) | 4 (fixe) |
| Compatibilité ASCII |