Encodage de caractères
ASCII
American Standard Code for Information Interchange contient 128 (16*8) caractères :
- Espace → 20(16) → 32(10)
- A → 41(16) → 65(10)
Chaque caractère est codé sur 7 bits. Ce qui laisse un bit de libre dans un octet (codes 128 à 255).
1 caractère = 1 code ASCII (0...127) = (0...2^7-1) = 7 bits + le bit de poids fort (le plus à gauche) à 0 = 1 octet
Les codes 128 à 255 sont utilisés pour représenter des caractères spécifiques à une langue. Donc le même code (128-255) donne un caractère différent en fonction de la langue.
Les Code Page
Se sont les dénominations des tables pour les caractères 128 à 255.
- Windows-1252 ou CP-1252 ou ANSI (inclut intégralement ISO-8859-1)
- ISO-8859-1 ou Latin 1
- ISO-8859-15 ou Latin 9 ou Latin 0
Unicode
À la différence d'ascii, tous les caractères possibles sont dans la même table.
Contient 65536 caractères.
1 caractère = 1 code unicode (0...65535) = (0...2^16-1) = 16 bits = 2 octets
Encodages possible:
- UTF-8 (8 bits)
- UTF-16 (16 bits)
- UCS-2 (2 octets)
UTF-8
UTF-8 (Universal character set Transformation Format 8 bits) est une manière intelligente de stocker (d'encoder) Unicode :
- les caractères dont les codes vont de 0 à 127 sont codés sur 1 octet
- les caractères dont les codes vont de 128 à 2047 sont codés sur 2 octets
- les caractères dont les codes vont de 2048 à 65535 sont codés sur 3 à 6 octets
Les codes ASCII pour les caractères de 0 à 127 les mêmes en UTF-8:
- A (ascii) = 41(16)
- A (unicode) = U+0041
- A (utf8) = masque 1 octet (0xxxxxxx) + U+0041 (0000 0000 0100 0001) = 0100 0001 = 41(16)
Fonctionnement de l'UTF- 8
Pour les caractère stocké sur 1 octet on conserve le même code que celui d'ASCII : 0xxx xxxx
Pour les caractère stockés sur 2 à 4 octets, le premier octet donne la longueur du caractère au travers du nombre de 1 suivis d'un 0 (110x xxxx pour 2 octets, 1110 xxxx pour 3 octets, etc.); les autres commencent par 10xx xxxx, qui sert de marqueur pour retrouver le début d'un caractère (on ne le trouve pas sur le premier octet).
Le code Unicode du caractère sera ensuite stocké dans les x, en commençant avec son bit de poids faible dans le dernier bit du dernier octet, et en remontant vers le premier octet (le reste est rempli avec des 0).
1 octet : 0xxxxxxx 2 octets : 110xxxxx 10xxxxxx 3 octets : 1110xxxx 10xxxxxx 10xxxxxx 4 octets : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
é → U+00E9 = 1110 1001 enveloppe UTF-8 pour 2 octets car entre 128 et 2047 : 110xxxxx 10xxxxxx 110x xxxx 10xx xxxx xxx0 0011 xx10 1001 =================== 1100 0011 1010 1001 = 0xC3 0xA9
Avec ou sans BOM
Le codage avec BOM (Byte Order Mark) rajoute des caractères en début de fichier.
Ces caractères ne sont utiles qu'en UTF-16 ou UTF-32. Ils permettent d'indiquer le byte order (big-endian ou little-endian).
Encoding Scheme Signature | Signature |
---|---|
UTF-8 | EF BB BF |
UTF-16 Big-endian | FE FF |
UTF-16 Little-endian | FF FE |
UTF-32 Big-endian | 00 00 FE FF |
UTF-32 Little-endian | FF FE 00 00 |
little-endian / big-endian
Définit l'ordre dans lequel les données sont rangées.
Exemple pour une unité atomique de 1 octet et un incrément d'adresse de 1 octet: 0xA0B70708
- little-endian (de droite à gauche, octet de poids le plus faible en premier): 08 07 B7 A0
- big-endian (de gauche à droite, octet de poids le plus fort en premier): A0 B7 07 08
En référence aux Voyages de Gulliver ou un décret oblige les habitant de Lilliput à manger les œufs à la coque par le petit bout. Les rebelles sont appelés gros-boutistes et les partisans les petit-boutistes. |
Exemple
Le jeu de caractères permet de connaître le code correspondant à un caractère.
L'encodage définit la manière dont sera stocké ce code.
Caractère | charset jeu de caractères → |
Code | encoding encodage → |
Bits |
---|---|---|---|---|
é | Unicode → |
U+00E9 1110 1001(2) 233(10) |
UTF-8 → |
codé sur 2 octets car entre 128 et 2047 110x xxxx 10xx xxxx & 1110 1001 = 1100 0011 1010 1001 0xC3 0xA9 |
Convertion
# connaitre les propriétés d'un fichier file Fichier.txt # Non-ISO extended-ASCII text = ISO-8859-1 # convertion d'un fichier ISO-8859-1 en UTF-8 iconv -f ISO-8859-1 -t UTF-8 Original.txt -o UTF8.txt |