Fixer le paramètre HTTP charset

Quand un serveur envoit un document à un agent utilisateur (par exemple un navigateur) , il transmet aussi le format des données via l'entête HTTP Content-Type. Cette information est écrite sous la forme d'un type MIME. Cet article est un point de départ pour ceux ayant besoin de fixer l'information de codage dans l'entête HTTP.

De plus amples informations sur des sujets connexes sont disponibles dans les articles how to declare character encoding in HTML pages, ou  savoir vérifier les en-têtes HTTP.

Le paramètre charset

Tous les documents transmis par HTTP et de type texte, comme les contenus text/html, text/plain, etc., peuvent être accompagnés d'un paramètre charset dans l'entête HTTP, afin de spécifier le codage du document.

Il est très important de toujours libeller les pages Web de manière explicite. La norme HTTP 1.1 indique que le codage par défaut est ISO-8859-1. Cependant il y a bien trop de documents sans information de charset et dans d'autres codages que ISO Latin-1, aussi les navigateurs utilisent, lorsque le document visualisé ne contient pas d'information de codage, un codage par défaut réglé par l'utilisateur.

Voici un exemple de ligne typique présente dans l'entête HTTP :

Content-Type: text/html; charset=utf-8

En théorie, n'importe quel codage de caractère qui a été enregistré par l'IANA peut être indiqué, mais aucun navigateur ne les interprète tous. Plus un codage est utilisé, plus il y a de chances qu'un navigateur le supporte. Un codage d'Unicode tel quel UTF-8 est un excellent choix, pour nombre de raisons.

Configuration du serveur

La façon de configurer le serveur pour qu'il envoit la bonne information de charset dépend du logiciel utilisé. Vous devez avoir les droits d'administration appropriés pour pouvoir modifier les paramètres du serveur.

Apache. Pour des répertoires ou des ressources individuelles (fichiers), on peut utiliser les directives AddCharset (Apache 1.3.10 et supérieur) ou AddType. Avec la directive AddDefaultCharset (Apache 1.3.12 et supérieur), il est possible de définir le charset par défaut pour l'ensemble du serveur. Pour plus d'informations, voyez l'article Setting 'charset' information in .htaccess.

Jigsaw. Utiliser un indexer dans JigAdmin afin d'associer les extensions avec les charsets, ou fixer le charset directement sur une resource.

IIS 5 et 6. dans le gestionnaire des services Internet, cliquez avec le bouton droit sur "site Web par défaut" (ou le site particulier que vous souhaitez configurer), et ouvrez "Propriétés" => onglet "Entêtes HTTP" => bouton "Types de fichiers..." => "Nouveau type...". Précisez l'extension que vous souhaitez associer, une à la fois. Les utilisateurs du serveur IIS voudront sans doute que les extensions ".htm" et ".html" soient configurées. Précisez alors dans le content type la valeur "text/html;charset=utf-8" (sans les guillemets ; remplacez utf-8 par le codage désiré ; ne laissez aucun espace dans la chaine car IIS ignore tout ce qui suit un espace). Pour IIS4, vous pouvez avoir à utiliser "Entêtes HTTP" => "créer un entête HTTP personnalisé" si la procédure précédente ne fonctionne pas.

Langages de scripts et entête HTTP

Il est aussi possible de renvoyer la bonne valeur dans l'entête à l'aide de langages de script côté serveur. Par exemple :

Perl. Renvoyer les entêtes avant tout contenu de la page. Après le dernière entête, renvoyer un double saut de ligne. Par exemple :
print "Content-Type: text/html; charset=utf-8\n\n";

Python. Même syntaxe que Perl (sauf le point virgule en fin de ligne à supprimer).

PHP. Avant d'avoir renvoyé du contenu, utiliser la fonction header(), par exemple :
header('Content-type: text/html; charset=utf-8');

Servlets Java. Avant d'avoir obtenu un objet (Stream ou Writer) pour la sortie, utiliser la méthode setContentType de ServletResponse, par exemple :
resource.setContentType ("text/html;charset=utf-8");
Si vous utilisez un objet Writer, les conversions depuis les string Java vers le codage sélectionné sont effectuées automatiquement par la servlet.

JSP. Utiliser la directive de page, par exemple :
<%@ page contentType="text/html; charset=UTF-8" %>
Une impression avec out.println() ou les éléments d'expression (<%= object%>) est automatiquement convertit vers le codage sélectionné. La page elle-même est aussi interprétée en utilisant ce codage.

ASP and ASP.Net. Le ContentType et le Charset sont fixés indépendemment, chacun au moyen d'une méthode de l'objet Response. Pour déclarer le codage, utiliser par exemple :
<%Response.charset="utf-8"%>
En ASP.Net, l'initialisation de Response.ContentEncoding impactera autant le paramètre HTTP Charset que le codage réel du document renvoyé (les deux devant être bien sûr  identiques). La valeur par défaut peut être fixée dans l'élément globalization de Web.config (ou Machine.config, qui contient à l'origine la valeur UTF-8).