Charset iso-8859-1, iso-8859-15, utf-8, lequel choisir ?

Astuce par (Intégrateur du Dimanche, Strasbourg)
Créé le , mis à jour le (237369 lectures)
Tags : xhtml, utf8, utf, iso-8859, 8859, encodage

Il faut tout d'abord distinguer deux familles d'encodage de caractères : les "locaux" et les "internationaux".

Les jeux de caractères locaux (dont font partie iso-8859-1 et iso-8859-15 - parfois désignés comme latin1 et latin9) sont destinés à des documents dans un seul système d'écriture (une langue ou un groupe de langue utilisant un même alphabet ou syllabaire). Au contraire, les jeux de caractères internationaux (dont fait partie l'UTF-8) sont destinés à encoder des document dans n'importe quel système d'écriture (et donc n'importe quelle langue). Ce sont des standards Unicode.

Alors que choisir ?

On peut observer deux cas de figure:

  1. Mon site gère différents systèmes d'écriture (par exemple l'espagnol et le russe) ou va le faire à l'avenir :
    La seule solution gérable dans ce cas est l'utf-8. En effet, il affiche correctement les différents caractères nécessaires à tous les systèmes permettant de ne pas se préoccuper de la nature du contenu lors de son affichage.
  2. Mon site ne gère actuellement qu'un système d'écriture (par exemple anglais et français) :
    C'est ici que la question se pose vraiment, et la réponse est comme d'habitude - ça dépend.

Voici un aperçu des avantages et inconvénients de chaque solution :

L'iso-8859-1...

  • est simple à employer (c'était souvent celui "par défaut", c'est moins vrai aujourd'hui);
  • est le plus minimal possible (donc souvent le plus rapide);

mais...

  • implique d'utiliser des entités HTML dès que l'on souhaite insérer un caractère ne faisant pas partie des quelques 189 disponibles;
  • ne gère que les langues occidentales (latines) et est donc faiblement adaptable.

L'iso-8859-15 est dérivé de l'iso-8859-1. Certains caractères jugés inutiles ont été retirés et d'autres ajoutés à leur place (notamment le symbole de l'euro, «€», et le «e dans l'o»). Il présente globalement les mêmes caractéristiques que l'iso-8859-1 avec cependant le désavantage d'être apparu plus récemment et d'être donc un peu moins répandu/supporté.

L'utf-8...

  • gère la plupart des langues utilisables et est donc facilement adaptable;
  • permet de se passer de la plupart des entités html (les caractères réservés «<», «>» et «&» devront toujours être échappés en &lt; &gt; et &amp;);
  • représente «l'aboutissement» de l'encodage, il est peu probable que vous ayez à changer pour un autre suite à une évolution du site;

mais...

  • code les caractères d'une manière plus complexe (et consomme donc souvent légèrement plus de ressources).

Évolution des tendances

La tendance étant à l'internationalisation et à la portabilité, l'UTF-8 devient populaire, et de fait son support est assuré de plus en plus efficacement par les éditeurs texte autant que par les langages de programmation et les bases de données (MySQL permet la gestion des jeux de caractère depuis sa version 4.1).

En conclusion, on peut dire qu'une bonne partie des désavantages de l'iso-8859-1 proviennent de sa définition même, alors que ceux de l'utf-8 disparaissent petit-à-petit. La balance pencherait donc plutôt du côté du dernier. Cela ne fait pas du premier un encodage obsolète pour autant, il faut seulement prendre conscience des limitations que l'on s'impose et savoir si elles ne risquent pas de devenir gênantes à l'avenir. Rappelez-vous qu'il est bien plus simple de commencer directement dans le bon encodage que de changer à posteriori.

Comment déclarer le charset ?

  1. Avec l'en-tête HTTP Content-type :
    • Via un fichier .htaccess : AddDefaultCharset UTF-8
    • En PHP : header('Content-Type: text/html;charset=UTF-8');
  2. En XML et XHTML, avec le prologue : <?xml version="1.0" encoding="UTF-8"?>
  3. Grâce à la balise meta dans le code
    • En HTML5 : <meta charset="UTF-8">
    • En HTML4 : <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    • En XHTML 1.1 : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ressources