Démystifier Unicode
Un article de Haypo.
Retour à l'accueil des codages
Cet article tente d'expliquer la différence entre glyphe, caractère, encodage, code et octet.
Sommaire |
[modifier] Glyphe
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.


