Démystifier Unicode

Un article de Haypo.

Retour à la page précédente Retour à l'accueil des codages

Cet article tente d'expliquer la différence entre glyphe, caractère, encodage, code et octet.

Sommaire

[modifier] Glyphe

Glyphe de la lettre A
Glyphe de la lettre A

Un glyphe est la représentation graphique. Voyez ci contre le glyphe de la lettre « A » dans la police DejaVu Mono Bold en taille 24 points (image grossie 6x).

[modifier] Charset

En informatique, chaque caractère est identifié par un code unique qui est un nombre entier naturel (0, 1, 2, 3, ...). Par exemple, la lettre latine A majuscule a souvent le code 65.

En informatique, la correspondance entre un caractère et un code est décrite par un charset (character set en anglais : ensemble de caractère). Un charset contient un nombre limité de codes.

Quelques exemples de code dans différents charsets :

Lettre ASCII ISO-8859-1 CP1252 Unicode
0 48 48 48 48
A 65 65 65 65
é - 233 233 233
- - 128 8364

Le caractère euro (« € ») n'existe pas dans ISO-8859-1. Il a été ajouté dans son grand frère : ISO-8859-15 (latin9).

Le charset ASCII a des codes de 0 à 127, alors que ISO-8859-1 et CP1252 ont des codes de 0 à 255. Unicode est un cas à part car il a des codes supérieurs à 100000. C'est le plus gros des charsets et d'ailleurs il contient tous les autres !

[modifier] Encoding

Un code n'est pas utilisable tel quel en informatique car l'ordinateur ne parle qu'en octets. Il faut alors encoder les codes en octets. Les charsets anciens (ASCII, ISO-8859-*, CP1252) sont triviaux à encoder : étant donné que les codes sont entre 0 et 255, un code tient dans un seul octet.

Les charsets modernes comme Unicode ont des codes plus grand que 255, il faut donc utiliser 2 octets ou plus. Pour encoder Unicode, il existe par exemple l'encodage UTF-8. UTF-8 utilise la rêgle suivante :

  • Un octet pour les codes 0 à 127 (7 bits)
  • Deux octets pour les codes 128 à 2047 (8 à 11 bits)
  • Trois octets pour les codes 2048 à 65535 (12 à 16 bits)
  • Quatre octets pour les codes 65536 à 2097151 (17 à 21 bits)

Pour les détails de l'organisation des bits, lisez l'article Wikipédia sur UTF-8.

[modifier] Distinguer charset et encoding

Quasiment tout le monde confond charset et encoding : ces deux termes sont mélangés dans les articles trouvés sur Internet. Pourtant, c'est deux notions différentes. Commençons par des exemples :

  • UTF-8, UTF-16 (LE/BE), UTF-32 (LE/BE) sont des encoding (ce n'est pas un charset)
  • Unicode est un charset (ce n'est pas un encoding)
  • ASCII et ISO-8859-1 sont des charsets mais on les considére comme des encoding car le rêgle d'encodage est trivial : un code tient dans un octet et donc les notions de caractère, code et octet ne peuvent être facilement distinguées

[modifier] ISO-8859-1, Unicode et UTF-8

Il est difficile de distinguer ISO-8859-1, Unicode et UTF-8. Pour commencer, ISO-8859-1 est à la fois un charset (correspondance caractère <=> code) et un encodage (code <=> octet). Unicode est uniquement un charset (caractère <=> code) et UTF-8 est uniquement un encodage (code <=> caractère).

Caractère Code ISO-8859-1 Code Unicode Octet ISO-8859-1 Octet UTF-8
A 65 65 0x41 0x41
é 233 233 0xE9 0xC3 0xA9

Note :

  • 0x41 (hexadécimal) = 65 (décimal)
  • 0xE9 (hexadécimal) = 233 (décimal)
  • 0xC3 (hexadécimal) = 195 (décimal)
  • 0xA9 (hexadécimal) = 169 (décimal)

On voit qu'en fait, ISO-8859-1 et Unicode utilisent les même codes. Par contre, la représentation en octets est différente car ISO-8859-1 et UTF-8 sont deux encodages différents.

Pour information, les 256 premiers codes d'Unicode sont en fait ceux d'ISO-8859-1. C'est fait exprès pour raison de compatibilité. Il est donc normal d'y trouver des similarités.

[modifier] Voir aussi