Récemment sur 2 projets différents à quelques jours d’intervalle, j’ai eu à me replonger dans l’encodage de chaînes de caractères que je pensais maîtriser …
Voyons si vous serez plus à l’aise que moi et prenez quelques instants pour “deviner” ce qu’affiche le code suivant :
1 2 3 4 5 6 7 8 |
[sourcecode language='csharp' padlinenumbers='true'] var data = new byte[] { 72, 135, 148, 108, 211, 32, 75, 211, 114, 208, 100 }; var sAscii = System.Text.ASCIIEncoding.ASCII.GetString(data); var sUTF8 = System.Text.UTF8Encoding.UTF8.GetString(data); Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetBytes(sAscii).Length); Console.WriteLine(System.Text.UTF8Encoding.UTF8.GetBytes(sUTF8).Length); [/sourcecode] |
.
.
.
.
.
.
.
.
.
La réponse est :
1 2 3 4 |
[sourcecode language='csharp' ] 11 21 [/sourcecode] |
Si vous avez répondu 11 & 11, vous avez besoin d’un petit rappel sur les différents codage possibles :
- ASCII : Codage définissant 128 caractères numérotés de 0 à 127 (et donc codables sur 7 bits). Ex : A = 65
- Unicode : C’est un standard informatique qui permet d’échanger du texte au niveau mondial. De manière simplifiée, tout caractère est défini par une page de code (1252 étant par exemple l’alphabet latin) et un point de code (définissant un caractère à l’intérieur de cette page de code)
ASCII définit aussi bien la valeur d’un caractère (65 pour le “A” que son codage en binaire 1000001) alors que Unicode n’est qu’une définition d’un caractère. Son codage peut se faire ensuite selon plusieurs formats tels que UTF-8, UTF-16, UTF-32. (UTF signifiant “Universal Character Set Transformation Format”)
Le chiffre à la suite d’UTF ne signifie pas, contrairement à ce que j’avais en tête, le nombre de bits nécessaire au codage d’un caractère mais le nombre de bits minimal nécessaire au codage d’un caractère.
Ainsi, un codage en UTF-8 signifie que le caractère sera codé sur au moins 8 bits mais potentiellement plus. Une des spécificités d’UTF-8 est que ses 127 premiers caractères sont codés de la même manière qu’en ASCII, ce qui explique pourquoi UTF-8 est l’encodage de base utilisé pour la plupart des sites Web)
Pour en revenir au bout de code présenté, la première ligne de code présentée effectuant une double conversion d’entiers inférieurs à 127 (donc “compatibles” ASCII), on reste sur une bijection 1 octet => 1 octet. Par contre, dans la deuxième, on effectue une conversion d’entiers supérieurs à 127 et donc 1 octet peut donner plus qu’un 1 octet.