Application Web

Dans une application Web, il est important de toujours utiliser le même encodage dans toute la chaîne de production.

Voici des éléments à vérifier

  • L'éditeur du document texte.
  • L'attribut encoding="" d'un document XML
  • La balise <meta http-equiv="Content-Type" content="" /> d'un document XHTML.
  • L'encodage envoyé dans les réponses du serveur web. Par exemple, les serveurs Apache2 envoyait par défaut le type mime mais aucun encodage. Puisqu'il n'y avait pas d'encodage, c'est le navigateur qui décide.
  • L'encodage par défaut du navigateur lorsque le serveur ne le spécifie pas, ni le contenu interne. Préférence "intl.charset.default" et "intl.fallbackCharsetList.ISO-8859-1" de Iceweasel dans about:config.
  • L'encodage de préférence dans une requête jquery $.ajax(), option contentType.

Aujourd'hui, il est préférable d'utiliser UTF-8 pour le développement Web

  • vim ne devrait pas afficher [converti] lors de l'ouverture et de l'enregistrement de fichier
  • echo "é" | hexdump -C devrait affiché c3 a9 ("é" en utf-8) et non pas e9 ("é" en iso-8859-1)
  • file --mime file.txt devrait afficher text/plain; charset=utf-8
  • La première ligne des documents XML devrait être: <?xml version="1.0" encoding="UTF-8" ?>
  • Les documents HTML et XHTML devrait avoir un encodage de spécifié dans la balise meta.
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  • Le serveur devrait envoyer l'encodage UTF-8.
    On pourrait par exemple utiliser les lignes suivantes dans Apache2:
    AddCharset UTF-8   .html .htm .txt .xml .svg .css .js
    Il existe déjà cette ligne, qui ajoute l'entête charset=UTF-8 pour les fichiers avec une extension .utf8 comme file.utf8.txt ou file.txt.utf8:
    AddCharset UTF-8   .utf8
  • Le langage de programmation sur le serveur devrait envoyer l'encodage UTF-8
    Avec PHP5 dans /etc/php5/apache2/php.ini (modifié dans la version 5.4 de iso-8859-1 à UTF-8, source ChangeLog-5):
    default_charset = "UTF-8"
    En PHP5, on peut aussi forcer le type mime et l'encodage:
    <?php header('Content-type: text/html; charset=UTF-8') ?>
  • Si on utilise l'option contentType avec jquery $.ajax({contentType: "text/xml; charset=utf-8"})
  • L'encodage dans MySQL (attention utf-8 avec un tiret ne fonctionne pas, il faut utiliser utf8):
    CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE tablename (...) CHARACTER SET = UTF8 COLLATE = utf8_unicode_ci;
    L'encodage de connexion MySQL/PHP:
    $db_handler = new PDO($dsn, $user, $password,
                          array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'.));
  • L'affichage des "Informations de la page" (CTRL-I) dans Iceweasel devrait afficher le bon encodage UTF-8.
  • On devrait voir l'entête de la réponse "Content-Type" dans l'onglet Réseau de la console web d'Iceweasel pour une requête avec statut 200 (il n'y pas de telle entête pour une réponse 302).

Iceweasel affiche maintenant ce message dans la console de développement si on ne précise pas l'encodage dans la balise meta: L'encodage de caractères du document HTML n'a pas été déclaré. Le document sera affiché avec des caractères incorrects pour certaines configurations de navigateur si le document contient des caractères en dehors de la plage US-ASCII. L'encodage de caractères de la page doit être déclaré dans le document ou dans le protocole de transfert.