vendredi 6 mars 2009

Unicode et encodages

Pour mon projet courant, je dois gérer des fichiers qui ont différents formats d'encodage. Ça m'a permis de me rendre compte que je ne comprenais pas très bien les notions d'encodage et d'Unicode. J'ai donc pris du temps pour mieux comprendre le tout, et j'ai fini par me dire pourquoi pas ne pas en faire profiter d'autres!

Unicode

Le principe d'Unicode est de définir un index pour chaque charactère possible et imaginable (appelé des code points), mais pas de définir comment ceux-ci seront représentés (encodés) par un ordinateur.

Avec les premières versions d'Unicode, on pouvait représenter tous les charactères sur 2 bytes. D'où l'idée répandue que c'est un format de 2 bytes. Mais le standard a évolué depuis et maintenant, 2 bytes ne sont plus suffisants pour représenter tous les caractères.

Encodages

L'encodage ANSI est un encodage 8 bits (1 byte) de Microsoft. Il est basé sur ASCII pour les 127 premiers charactères et définit des caractères pour les langues occidentales pour les caractères 128 à 255. On appelle aussi cet encodage Windows-1252 ou CP1252.

L'encodage ISO-8859-1 est aussi un encodage 8 bits. Comme ANSI, il est basé sur ASCII pour les 127 premiers charactères et définit des caractères pour les langues occidentales pour les caractères 128 à 255. Il est très semblable à ANSI pour les caractères 128 à 255, mais il y a des différences (voir "ISO-8859-1 and Windows-1252 confusion" sur cette page).

UTF-8 est un encodage qui s'adpate en utilisant de 1 à 4 bytes selon le caractère. Il peut encoder tous les caractères Unicode. Un des avantages de cet encodage est que, si on n'utilise que des caractères ASCII, tous les caractères n'utiliseront qu'un 1 byte ce qui permet à de vieux programmes qui ne manipulent que des caractères ASCII de 1 byte de continuer à fonctionner.

UCS-2 est un format d'encodage 16 bits (2 bytes). Il supporte la majorité des caractères Unicode, mais pas tous car il n'utilise jamais plus de 16 bits pour un caractère.

UTF-16 est aussi un format d'encodage 16 bits (2 bytes). Mais contrairement à UCS-2, il peut représenter des caractères sur 32 bits (4 bytes) au besoin pour encoder tous les caractère Unicode.

Et Java?

Pour la classe String, avant la version 5, Java, ne pouvait représenter que les caractères Unicode pouvant tenir sur 16 bits (comme UCS-2). Mais depuis la version 5, on peut utiliser tous les caractères Unicode, qui seront encodés en UTF-16. (voir javadoc de la classe java.lang.Character).

Références

BetterExplained
JoelOnSoftware
dmiessler

Aucun commentaire: