34 points par GN⁺ 2025-09-13 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • UTF-8 est une méthode d’encodage à longueur variable qui permet de représenter des millions de caractères tout en conservant une compatibilité ascendante avec ASCII
  • La zone 7 bits identique à ASCII (U+0000~U+007F) utilise telle quelle 1 octet, ce qui fait qu’un fichier ASCII est aussi un fichier UTF-8 valide
  • Les autres caractères sont représentés par des séquences de 2 à 4 octets ; le motif de bits de l’octet de tête en définit la longueur, et les octets suivants commencent par 10, ce qui permet de les identifier comme octets de continuation
  • Grâce à cette conception, UTF-8 peut gérer un jeu de caractères universel tout en restant parfaitement compatible avec les systèmes ASCII existants, ce qui en fait l’encodage de caractères le plus utilisé
  • D’autres encodages Unicode comme UTF-16 ou UTF-32 n’offrent pas cette compatibilité ASCII

L’excellence de la conception de UTF-8

  • Lorsque j’ai découvert l’encodage UTF-8 pour la première fois, j’ai été très impressionné par sa structure compatible avec l’ASCII existant, tout en réunissant dans un seul système des millions de caractères issus de langues et d’écritures différentes
  • Fondamentalement, UTF-8 peut exploiter jusqu’à 32 bits, tandis que ASCII n’en utilise que 7
  • Les principes de conception de UTF-8 sont les suivants
    • Tout fichier encodé en ASCII est un fichier UTF-8 valide
    • Tout fichier UTF-8 ne contenant que des caractères ASCII est un fichier ASCII valide
  • L’idée de fusionner un ancien système limité à 128 caractères avec un système couvrant des millions de caractères est particulièrement novatrice

Concepts de base de UTF-8

  • UTF-8 est un encodage de caractères à largeur variable (variable-width encoding) conçu pour représenter tous les caractères du jeu de caractères Unicode
  • Chaque caractère est encodé sur 1 à 4 octets
  • Les 128 premiers caractères (U+0000~U+007F) sont stockés sur un seul octet, ce qui assure la compatibilité ascendante avec ASCII
  • Les autres caractères sont encodés sur deux, trois ou quatre octets
  • Les bits de tête du premier octet déterminent le nombre total d’octets nécessaires à l’encodage
Motif sur 1 octet Nombre d’octets Motif de la séquence complète d’octets
0xxxxxxx 1 0xxxxxxx (ASCII classique)
110xxxxx 2 110xxxxx 10xxxxxx
1110xxxx 3 1110xxxx 10xxxxxx 10xxxxxx
11110xxx 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • Les 2e, 3e et 4e octets d’une séquence multi-octets commencent toujours par 10, ce qui signale clairement qu’il s’agit d’octets de continuation
  • En combinant les bits restants de l’octet principal et des octets de continuation, on obtient un point de code
    • Un point de code est un identifiant Unicode unique, représenté avec le préfixe "U+" et en hexadécimal
    • Exemple : le point de code de "A" est U+0041
  • Le processus d’interprétation d’un caractère à partir d’octets UTF-8 est le suivant
    • 1. On lit un octet ; si le début vaut 0, il s’agit d’un caractère sur un seul octet (ASCII), on utilise alors les 7 bits restants pour le caractère, puis on passe à l’octet suivant
    • 2. Si ce n’est pas 0
      • 110 signifie un caractère sur 2 octets, on lit donc un octet supplémentaire
      • 1110 signifie un caractère sur 3 octets, on lit donc les 2 octets suivants
      • 11110 signifie un caractère sur 4 octets, on lit donc 3 octets supplémentaires
    • 3. On combine, pour les octets déterminés, les bits restants hors bits de tête afin d’obtenir la valeur binaire du point de code
    • 4. On recherche ce point de code dans le jeu de caractères Unicode et on l’affiche à l’écran
    • 5. Puis on recommence avec l’octet suivant

Exemple : le caractère hindi "अ"

  • Représentation UTF-8 : 11100000 10100100 10000101 (3 octets)
  • Premier octet (11100000) → indique qu’il s’agit d’un caractère sur 3 octets
  • Combinaison des bits utiles des trois octets → 00001001 00000101 = hexadécimal 0x0905
  • Le point de code U+0905 correspond au caractère dévanagari "अ"

Exemples de fichiers

  • 1. Hey👋 Buddy

    • Composé de 13 octets au total
      • Caractères ASCII (H, e, y, B, u, d, d, y, espace) → 1 octet chacun
      • 👋 (U+1F44B) → 4 octets 11110000 10011111 10010001 10001011
    • Ce fichier est un fichier UTF-8 valide, mais comme il contient un caractère non ASCII (emoji), il n’est pas compatible ASCII
  • 2. Hey Buddy

    • 9 octets au total, tous dans la plage ASCII
    • Ce fichier est donc à la fois un fichier ASCII valide et un fichier UTF-8 valide

Comparaison avec d’autres encodages

  • Il existe quelques encodages compatibles avec ASCII, mais aucun n’est aussi largement utilisé que UTF-8
  • GB18030 (standard chinois), entre autres, offre aussi une compatibilité ASCII, mais n’est pas largement utilisé
  • La famille ISO/IEC 8859 repose sur une extension sur un seul octet (jusqu’à 256 caractères), ce qui en limite la portée
  • UTF-16/UTF-32 ne sont pas compatibles ASCII
    • 'A' (U+0041) : en UTF-16 00 41, en UTF-32 00 00 00 41

Bonus : UTF-8 Playground

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.