Conversions : ISO-8859-1/Windows-1252 et UTF-8

Publié le 21 avril 2008 par Olivier Duval

Imaginons que nous ayons une page encodée en ISO-8859-1 (ou Windows-1252), soit le code page 28591. Si, si, cela peut arriver d'avoir un existant qui balade encore des pages avec cet encodage obsolète, parfois, le choix est limité de tout passer en UTF-8 (code page 65001, la norme actuelle pour l'encodage), car il faut bien souvent le faire en une seule passe, et ce n'est pas toujours simple lorsqu'il existe beaucoup de pages.

Donc, nous avons une page en ISO, dans celle-ci, nous souhaitons consommer un flux (Atom) : celui-ci est encodé en UTF-8 (ce qui est bien...sauf dans notre cas). Certains caractères n'apparaitront pas bien à l'affichage (apparaitront des ? à la place des “ ou —)

dans une page ISO

au lieu d'obtenir cette page bien formée :

pour corriger cela, il faudra les convertir en ISO (car page en ISO...)

Une table de correspondance de 27 caractères qui posent souci (prendre le code Hexa pour l'ISO/Win-1252, et le code xml pour l'UTF ) sur ce site

Pour chaque caractère, on va remplacer le code UTF-8 par celui en ISO/Win-1252, un replace suffit , on pourra avoir une méthode utilitaire de ce type, le faire pour les 27 caractères (autrement dit, pas comme dans l'exemple ;-)) :

  1. public static String UTFtoWin1252(String laChaine)
  2. {
  3. string mystr = laChaine;
  4. mystr = mystr.Replace((char)0x2022,(char)0x95); // •
  5. mystr = mystr.Replace((char)0x20AC,(char)0x80); // €
  6. mystr = mystr.Replace((char)0x0153,(char)0x9C); // oe
  7. mystr = mystr.Replace((char)0x2026,(char)0x85); // …
  8. mystr = mystr.Replace((char)0x2013,(char)0x96); // –
  9. mystr = mystr.Replace((char)0x201C, (char)0x93); // “
  10. mystr = mystr.Replace((char)0x201D, (char)0x94); // ”
  11. mystr = mystr.Replace((char)0x2014, (char)0x97); // —
  12. return mystr;
  13. }

On substitue grâce à la fonction chaque caractère reçu en UTF par son équivalent ISO, on a bien le résultat escompté :

Bien entendu, ce n'est valable que dans une page ISO, si celle-ci passe en UTF, les caractères n'auront plus de sens - d'où la difficulté de passer tout ou partie d'un existant en UTF où il y a des hacks de ce type : le faire en une seule fois, et repasser sur toutes les pages, bon courage

Un site où vous pourrez retrouver tous les codes d'un caractère en le recherchant.