Plan de site Navigation
Blog & Blues Techniques et Standards de la Qualité Web

Accueil > weblog


- Lire le billet précédent - Lire le billet suivant -

Spécifier l'encodage des caractères d'un document (X)HTML

Par Laurent Denis, le 16 août 2004.

En-tête HTTP ? Prologue XML ? Meta http-equiv ? Voici un rapide résumé commis dans le forum Webmaster-Hub, en réponse à une question sur la bonne manière de spécifier l'encodage des caractères de ses documents :

Un navigateur tente de déterminer l'encodage d'un document successivement :

  • D'abord à partir de l'en-tête HTTP Content-Type envoyé par le serveur ;
  • A défaut, avec le prologue XML pour les documents XHTML traités comme XML ;
  • A défaut, avec la meta http-equiv="Content-Type" content="...; charset=..." pour les documents HTML et les documents XHTML traités comme du HTML ;
  • A défaut, en adoptant un encodage arbitraire d'après le contenu ou selon les réglages faits par l'utilisateur qui permettent de spécifier un encodage à utiliser en cas de doute (porte ouverte à toutes les erreurs possibles et imaginables).

Cependant :

  • L'en-tête HTTP ne suffit pas, car les utilisateurs n'accèderont pas forcément au document via HTTP. Il suffit par exemple qu'ils l'aient enregistré localement pour perdre l'information d'encodage ;
  • Le prologue XML n'est pas toujours souhaitable : il n'est obligatoire en XHTML1.0 Strict que lorsque :
    • celui-ci est traité en tant qu'XML (Ce que ne fait pas Internet Explorer) ;
    • que rien n'est spécifié au niveau serveur ;
    • et que l'encodage n'est pas en utf-8 ou en utf16.
    Il n'a donc aucun sens ni aucune utilité lorsque le XHTML sera traité en tant que HTML. On peut donc l'éviter pour le contenu adressé à Internet Explorer dans la mesure où il fait passer Internet Explorer 6.0 en mode de rendu Quirks (application du box-model Microsoft).

La "bonne pratique" serait donc :

  • de préciser prioritairement l'encodage via HTTP si on a accès à ce paramètre serveur, par exemple avec header("Content-type: text/html; charset=ISO-8859-1"); en PHP, ou <%response.ContentType=("text/html; charset=iso-8859-1")%> en ASP. D'autres méthodes sont détaillées dans The HTTP charset parameter ;
  • de le repréciser dans le document lui-même, avec le prologue XML (si nécessaire et lorsque le document est traité en tant que application/xhtml+xml), ou la meta (systématiquement en HTML et fortement recommandée en XHTML traité en tant que HTML) ;

Ce qui donne concrètement ;

En XHTML1.1 :
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>...</title>
En XHTML1.0 (traité comme du XML) ;
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>...</title>
En XHTML1.0 (traité comme du HTML) ;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>...</title>
Et en HTML ;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>...</title>

Enfin, il faut encore que le contenu respecte effectivement l'encodage en question, ce qui dépend de l'éditeur HTML utilisé. Ceci pose souvent un problème sous Windows avec les éditeurs qui encodent parfois en Windows-1252 des documents supposés être en ISO-8859-1. On ne s'en aperçoit que lorsqu'on utilise certains caractères Windows illégaux en HTML et XHTML.

Trackbacks

1. Le 16 août 2004 à 17:36, de Blog Alsacréations : XHTML, CSS et Standards web

Spécifier l'encodage des caractères d'un document (X)HTML

En-tête HTTP ? Prologue XML ? Meta http-equiv ? C'est une question que beaucoup se posent et Laurent Denis nous a concocté une très bon résumé des techniques à employer. Un billet intéressant à garder sous le coude....

Les trackbacks pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.

Commentaires

Fabrice Bonny, le 16 août 2004

Tiens, des bonnes pratiques d'Opquast... smiley clin d'oeil

Ok, ok, c'est la reprise et mon teasing est minable.

Laurent Denis, le 16 août 2004

C'est vrai qu'on attend avec impatience la publication des "mises en oeuvre" des bonnes pratiques Opquast smiley clin d'oeil

C'est sans d'ailleurs pour cela que l'expression m'est venue spontanéement..

glandium, le 16 août 2004

> L'en-tête HTTP ne suffit pas, car les utilisateurs n'accèderont pas forcément au document via HTTP. Il suffit par exemple qu'ils l'aient enregistré localement pour perdre l'information d'encodage

Entre nous, dans ce cas, c'est au navigateur d'être intelligent quand il enregistre...

Eric Daspet, le 16 août 2004

Je ne suis pas vraiment d'accord avec toi pour le prologue. Il reste à mon avis à conseiller pour un doc XHTML (l'histoire du box-model de msie6 n'est qu'une anecdote car de toutes façons ce box-model sera faux dans msie5 et que dans msie6 on peut le rétablir avec une simple règle CSS3 déjà implémentée).

Pourquoi ? parce que un outil XML voulant traiter le document ne se servira que du prologue, pas du méta (qui n'a de sens que pour un outil spécifique HTML). On vient donc de casser la compatibilité avec toute la chaîne XML, ce qui rend un peu inutile l'utilisation du XHTML je trouve.
Et malheureusement ce défaut se retrouve même sur les navigateurs (qui eux sont spécifiques HTML et devraient comprendre le méta) : en mode XHTML/XML, le méta n'est pas pris en compte pour déterminer le charset.
Reste l'entête HTTP, mais reste toujours le problème de la sauvegarde.

Laurent Denis, le 16 août 2004

@Eric, loin de moi l'idée de trancher pour ou contre le prologue XML ! Mon idée était simplement de mentionner l'un des facteurs de choix les plus souvent en cause. Mais j'aurais dû, en effet, indiquer le revers de la médaille.

Pour ma part, j'utilise ce prologue, pour la raison que tu indiques, sachant que, côté CSS, je m'efforce de faire des feuilles qui soient indifférentes au box-model ou qui s'accomodent de l'un comme de l'autre.

Laurent Denis, le 16 août 2004

Tiens, j'avais hésité à donner deux exemples pour XHTML, avec et sans le prologue, selon l'orientation HTML ou XML choisie... C'est fait.

Raphaël Wils, le 16 août 2004

Eric->"dans msie6 on peut le rétablir avec une simple règle CSS3 déjà implémentée"

Voila qui est interessant. On peut avoir des précisions ? un lien ?

Laurent Denis, le 16 août 2004

@Raphaël : c'est la propriété box-sizing, utilisable dans Mozilla, Opera 7, Explorer 5Mac... Mais pas IE6.0 Win smiley clin d'oeil

- Mode Microsoft : box-sizing: border-box
- Mode Standard: box-sizing: content-box

Voir:
- www.w3.org/TR/css3-box/#t...
- www.quirksmode.org/css/bo...

Eric Daspet, le 17 août 2004

pas MSIE6/win ?
Damned, je croyais le contraire (pas dans mozilla mais présent dans MSIE). J'ai du me tromper, désolé alors pour la fausse info.
Je croyais pourtant qu'il y avait une astuce CSS du type dans MSIE. Va falloir que je revoie mes classiques.

@Raph: ceci dit tu as toujours les hacks CSS (même si perso je n'aime pas trop, on a vite fait de s'y perdre) ou comme dit Denis : faire un design où le box-model n'influe pas de manière importante.

Laurent Denis, le 17 août 2004

Pour utiliser box-sizing dans IE Win, il faut encore une couche supplémentaire de hacks. Par exemple :
- webfx.eae.net/dhtml/boxsi...
- dean.edwards.name/IE7/
Beaucoup de bruit pour peu de choses, AMHA.

Raphaël Wils, le 17 août 2004

Je crois que je vais rester à une méthode simple pour le cas ou la taille est importante : un div sans margin ni padding avec le width qui va bien dans lequel se trouve le contenu avec tout les margin et padding que je veux.

Gloom, le 19 août 2004

Et bien, beaucoup de mes sites sont à mettre à jour à ce niveaux là...

Je crois que, du moins, dans un premier temps, je vais revenir en arrière et faire du (x)html en temps qu'html et pas en temps que document XML...

florent Claude, le 04 février 2005

tip-top les explications sur la détection de l'encodage.
ça faisait un moment que j'essayais un peu tout pour que mon navigateur reconnaisse le bon encodage!
en fait, il manquait juste la ligne php qui spécifie l'encodage dans l'entête http...
merci/.

Les commentaires pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.