Capsule : Encodage de caractères

Comment fait-on pour stocker du texte dans un ordinateur ?

Pour représenter du texte dans la mémoire d’un ordinateur, on doit convertir les caractères qui le composent, en nombres binaires. Pour cela, on procède en deux étapes :

  1. Associer un numéro (un « point de code ») à chaque caractère que l’on veut encoder.
  2. Encoder les points de code sous la forme d’une séquence de bits.

Pour la seconde étape, une première option est de convertir le numéro en une séquence de bits, de longueur fixe, par exemple, un octet (8 bits). Cette option a été retenue pour un grand nombre de normes de codage de caractères : ASCII, ISO 8859, Windows‑1252 (ANSI).

Norme d’encodage Windows‑1252
Fig. 1 – Norme d’encodage Windows‑1252

Une deuxième option est de coder les points de code sous la forme d’une séquence de bits de longueur variable. C’est le choix qui a été fait pour coder les milliers de caractères nécessaires à l’écriture des langues chinoises, du coréen et du japonais (Big5, Shif-JIS), ou pour coder les 128’172 caractères de la norme Unicode (UTF‑8).

Norme d’encodage UTF‑8
Fig. 2 – Norme d’encodage UTF‑8

En comparant les figures 1 et 2, vous pouvez constater que le point de code du caractère « é » est le même (E9) pour les deux normes. En revanche, dans le tableau de droite, on constate cette fois que la séquence binaire est très différente : 1110’1001 pour Windows‑1252 et 1100’0011 1010’1001 pour UTF‑8. Cet exemple illustre également le fait que les points de code inférieurs à 128 sont représentés dans les deux normes par la même séquence de bits.

Qu’est-ce qu’une norme d’encodage de caractères ?

Pour permettre l’échange d’information sous forme de texte numérique, il est nécessaire de s’accorder sur la manière d’encoder les caractères. C’est dans ce but que le standard ASCII a été proposé à la fin des années soixante. Une norme d’encodage est un document auquel chacun peut se référer pour coder et décoder des caractères sous forme numérique.

La norme ASCII ne définit que 128 caractères, dont les lettres majuscules et minuscules de l’alphabet latin, les chiffres et les principaux signes de ponctuation. Si l’on peut sans peine représenter un texte en anglais selon cette norme, elle est insuffisante pour représenter un texte en français ou en allemand et totalement inapplicable pour un texte écrit dans une langue chinoise. C’est pour cette raison que sont rapidement apparues de nouvelles normes permettant de représenter un plus grand nombre de caractères : CP437, Windows‑1252 (ANSI), MacRoman, ISO‑8859, UTF‑8, Big5, Shift‑JIS, etc. Toutes ces normes ont toutefois un point commun : les 128 premiers caractères sont codés de la même manière que dans la norme ASCII.

On peut distinguer trois niveaux de normes. Il y a d’abord les normes issues d’organismes de normalisation nationaux ou internationaux (ISO, CEN, ANSI, AFNOR, DIN, etc.). Il y a ensuite les normes issues d’organismes de normalisation privés qui représentent un domaine professionnel particulier (ECMA, W3C, IETF, etc.) et dont le rôle est d’élaborer des normes dans ce domaine pour éventuellement les soumettre à un organisme national ou international. Enfin, il y a les standards « de fait » qui ne sont pas issus d’organismes de normalisation, mais qui sont devenus standard grâce à une large distribution. Dans ce domaine, la norme Windows‑1252 est particulièrement intéressante. Bien qu’elle se base sur la norme ISO‑8859‑1, il s’agit d’une norme de caractères qui a été développée pour l’environnement Windows et qui n’a jamais été normalisée. Elle est cependant souvent appelée « code de caractères ANSI », car la société Microsoft avait à une certaine époque songé à la soumettre à l’ANSI (American National Standards Institute).

Qu’est-ce qu’un caractère ?

En informatique, un caractère peut soit représenter un signe graphique tel qu’une lettre minuscule, une lettre majuscule, un chiffre, un signe de ponctuation ou une espace, soit avoir une fonction spéciale. Dans ce dernier cas, on parle de « caractères de contrôle ». Ceux-ci n’ont pas de représentation graphique, ce sont des caractères « non imprimables », mais ils permettent, par exemple, de « contrôler » la position du caractère suivant. Parmi les plus courants, on peut citer l’espace, le caractère de tabulation, le saut de ligne (line feed), le retour de chariot (carriage return), et le retour en arrière (backspace).

Pourquoi est-ce important ?

Lorsqu’on utilise un programme avec une interface utilisateur en ligne de commande comme le shell du système d’exploitation, celui-ci reçoit des codes de caractères en provenance du terminal à travers l’entrée standard (stdin) et envoie des caractères vers le terminal en écrivant dans la sortie standard (stdout). Pour que le programme puisse interpréter sans erreurs les commandes de l’utilisateur et que, de son côté, le terminal puisse afficher les messages qu’il reçoit, il est impératif que tous deux utilisent la même norme d’encodage.

En Java, par exemple, si vous essayez de lire des caractères en utilisant un scanner sans rien préciser, le scanner s’attend à recevoir de l’UTF‑8. Or, si vous exécutez ce programme dans la console de Windows (cmd.exe), le terminal encode les caractères selon la norme CP850 et si vous l’exécutez dans la console de NetBeans, le terminal intégré les encode la norme CP1252. Cela ne pose pas de problème pour la saisie de chiffres ou de lettres sans accent, mais il ne sera pas possible de lire correctement des lettres accentuées ou certains caractères spéciaux. Pour éviter ce problème, on indique la norme d’encodage à l’initialisation du scanner.

1
2
3
4
5
6
7
8
9
... 
// Initialize the scanner with the Windows Latin 1 code page (Cp1252) 
// for the NetBeans console, or with the DOS Latin 1 code page (Cp850) 
// for the Windows consol (cmd.exe). 
Scanner scanner = new Scanner(System. in, "Cp1252"); 
... 
System. out.print("Veuillez saisir le symbole de l’unité de la mesure : "); 
String measureUnitSymbol = scanner.next(); 
...
Fig. 4 – Objet scanner avec norme d’encodage

On utilise également du texte pour permettre à des ordinateurs de communiquer entre eux. C’est le cas, par exemple, des protocoles HTTP et SMTP. Même si les éléments essentiels de ces protocoles n’utilisent que des caractères dont le code est inférieur à 128, la charge utile peut contenir des caractères spéciaux ou des lettres accentuées. Il est donc, ici aussi, important de connaître la norme d’encodage utilisé.