Encodage de caractères

De Banane Atomic
Aller à la navigationAller à la recherche

ASCII

American Standard Code for Information Interchange contient 128 (16*8) caractères :
Ascii.png

  • 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

Code Page Identifiers

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

Unicode → UTF-8

Convertion

Bash.svg
# 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

# remove BOM from UTF-8 encoded file
sed -i 's/\xef\xbb\xbf//' file.ext