Pourquoi utiliser UTF-8 dans les documents XML
Par M le mardi 19 décembre 2006, 18:21 - Technique - Lien permanent
Dans sa balise de déclaration, un document XML peut spécifier la méthode d'encodage des caractères utilisés tout le long de celui-ci.
Génial, aucun problème de lecture de caractères bizares à cause d'un décodage sur une mauvaise méthode!
Et bien non, loin de là...
Pour expliquer cela, il faut regarder la différence entre l'ASCII classique (et ses dérivés comme l'ISO8859-15 pour l'€) et l'UTF-8.
Un caractère ASCII est codé sur 7bit, ses dérivés se servent du dernier bit pour les extensions. UTF-8 a pour ambition de coder n'importe quel caratère sur 4 octets tout en gardant une compatibilité avec l'ASCII.
On se retrouve avec un système retro-compatible avec l'ancien standard, ce qui est très bien pour faciliter les migrations en douceur. Cependant, il y a un revert à la médaille car on peut se trouver dans des cas difficiles :
Exemple :
On a un fichier XML encodé en ISO8859-15, le tout bien déclaré dans l'en-tête XML, bref un fichier tout à fait valide du point de vue de l'encodage.
Maintenant, on va transférer le fichier sur un système considérant que par défaut, il lit les fichiers comme de l'UTF-8. On s'attend donc à ce que ça ne pose pas de problèmes vu qu'on a bien spécifié que le fichier était de l'ISO8859-15.
Et bien non! Le parser XML va utiliser les appels systèmes pour lire le fichier. Le système lit tous les fichiers texte comme de l'UTF-8, et à un moment, il lit le caractère ISO-8859-15 'é'.
'é' est représenté comme le chiffre 233 en décimal, il est > 127 donc il s'agit d'un caractère non ASCII. Jusque là, il n'y a aucune différence entre l'UTF-8 et l'ISO8859-15. Maintenant, en UTF-8, on va chercher à determiner sur combien d'octets est codé le caractère et on affichera forcément une suite de mauvais caractères...
Comment faire pour contourner ce problème ?
Heureusement, il y a une solution élégante à ce problème : tout coder en UTF-8 (pour les documents XML).
En reprenant le même exemple qu'au dessus mais à l'envers (on a de l'UTF-8 sur un système qui attend de l'ISO8859-1x ou de l'ASCII), on n'a pas de problème car la taille des caractères est fixe (1 octet = 1 caractère). En lisant le fichier XML avec un éditeur de texte, on verra des caractères bizarres, mais pas le parseur XML car il sait qu'il s'agit d'UTF-8 et fait la conversion à la volée.
Cette solution est LA solution à utiliser pour plusieurs raisons :
- Il s'agit d'une recommendation du W3C : XML 1.0 Il y est écrit :
All XML processors MUST accept the UTF-8 and UTF-16 encodings of Unicode 3.1autrement dit, l'ISO8859-15 n'est pas forcément pris en charge par tous les parseurs XML contrairement à l'UTF-8. - C'est mondialement utilisé ( W3C oblige), par exemple Google impose l'UTF-8 pour les sitemaps.