original.defeat a écrit :
Sur cette page par exemple, vous spécifiez un charset iso-8859-1. Or dans le <body>, l'on y trouve des accents non encodés. Un petit détail, mais qui a son importance.
Non : c'est au contraire tout à fait approprié.
Cette erreur sur les accents non encodés, encore fréquente, date de l'époque où l'on travaillait en us-ascii ou avec des navigateurs qui ne traitaient que des charset limités.
je reprends l'exemple de code concerné :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//FR" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> <head>
<title>Ma première page web</title>
<meta http-equiv="Content-type" content="application/xhtml+xml; charset=ISO-8859-1" />
</head>
<body>
Texte de la page. ceci est ma première page web. Je me débrouille bien non ?
</body>
</html>
Ce document est incorrect dans la mesure où une
meta http-equiv="Content-type" ne sera pas prise en compte dans un document XHTML réellement servi avec le type de contenu
application/xhtml+xml : La manière d'indiquer qu'il est en ISO-8859-1 n'est donc pas la bonne. (En outre, la DTD XHTML1.1, tout comme XHTML1.0 strict, n'autorise pas de texte anonyme dans l'élément body).
Mais il est par ailleurs tout à fait correct du point de vue de la présence des caractères accentués é et è pour un encodage ISO-8859-1.
Tous les caractères présents dans un "encodage de caractères" (charset) peuvent être écrits littéralement dès lors que l'application qui crée le document et le navigateur qui affichera le document gèrent tout deux ce charset.
C'est justement le rôle d'un charset, de ce point de vue : définir quels sont les caractères qui pourront être "saisis littéralement". Ces caractères seront encodés à l'enregistrement par l'application de saisie (l'éditeur HTML) et seront "décodés" par le navigateur une fois que celui-ci aura identifié le charset utilisé. Cet encodage sera transparent pour l'auteur, qui verra dans son fichier le caractère é, è, etc.
Mais tous les charset ne référencent pas autant de caractères les uns que les autres. Voir
Introduction aux jeux de caractères.
"Encodage" renvoit en fait à trois choses différentes :
1. Dans un document encodé en iso-8859-1:
- les caractères accentués é, è ... s'écrivent littéralement é, è... Il n'y a aucune raison de les "encoder", c'est à dire plus exactement de les spécifier sous forme d'entités : l'éditeur HTML sait le faire et s'en charge de manière transparente.
- A l'inverse, le caractère euro, qui n'est pas défini dans iso-8859-1, doit impérativement être indiqué sous forme d'entité. (C'est en iso-8859-
15 qu'il pourra être saisi littéralement).
- De même, la ligature oe, le tiret cadratin, le tilde, le boulet, le point de suspension, etc. devront être saisis sous forme d'entités dans un document en iso-8859-1, alors qu'ils pourront être saisis littéralement dans un document utf-8.
2. Il est donc nécessaire, selon le charset, de désigner certains caractères d'une autre manière. Le premier moyen possible est de recourir à leur
référence d'entité caractère. Mais attention: celle-ci n'est pas toujours disponible, selon que le format est en HTML4.01, en XHTML ou dans un autre dialecte XML : les entités caractères sont définies par les DTD (exemple :
les entités définies par HTML4.01, celles définies
par XHTML1.0 , celles définies par
MathML)
Dans un document HTML ou XHTML1.x encodé en iso-8859-1:
- les caractères accentués é, è...
peuvent s'écrire é è etc. bien que ce soit un alourdissement inutile du fichier. Tout aussi inutile que d'encoder en entité la lettre a (voir ci-dessous).
- le signe euro, qui n'existe pas dans le charset iso-8859-1,
doit être désigné par € en HTML comme en XHTML, car cette entité est définie pour chacun de ces formats (à moins de recourir à l'entité numérique expliquée ci-dessous).
- Mais le caractère apostrophe ne peut s'écrire ' qu'en XHTML : cette entité n'est pas définie en HTML4.01 (idem).
- le signe "plus moins" ne s'écrira ± qu'en MathMl : cette entité n'est pas définie en HTML - XHTML. C'est l'entité ± qui est définie dans ces formats.
3. Il est enfin
toujours possible, quelque-soit le format HTML ou XHTML, et quelque-soit le charset, de désigner n'importe quel caractère par
sa référence numérique unique, qui adresse directement sa position dans le jeu de caractères Unicode - ISO10646, standard universel du Web.
Quelque-soit le charset (us-ascii, iso-8859-1, iso-8859-15, utf-8, etc.) d'un document basé sur ISO10646 (HTML, XHTMl, MathMl, SVG, etc.) :
- la lettre a peut s'écrire a
- les caratères accentués é, è peuvent s'écrire é è etc.
- le signe euro peut s'écrire €
- l'apostrophe peut s'écrire '
- le signe "plus moins" peut s'écrire ±
Donc, en bref :
- le choix du charset détermine les caractères qui n'auront pas à être désignés sous forme d'entités.
- Les entités caractères disponibles diffèrent selon le format HTML XHTML XML. HTML et XHTML définissent cependant l'essentiel des entités caractères de la même manière.
- toutes les entités numériques sont disponibles dans un document HTML - XHTML
Et pour compléter le tableau des erreurs fréquentes:
- en tout début du processus, il faut avant tout que l'éditeur HTML utilisé gère effectivement le charset choisi. La mention
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> ne servira strictement à rien si votre éditeur HTML ou votre CMS génère en fait un document us-ascii, utf-16 ou autre.
- en cours de processus, il est indispensable d'indiquer aux applications concernées le charset utilisé : voir
Spécifier l'encodage des caractères d'un document (X)HTML. Rappel : un encodage (charset) s'indique d'abord, encore, et toujours par un en-tête HTTP. Il est
rappelé dans le fichier sous forme de meta, de prologue xml. Mais la méta ci-dessus
ne servira à rien si le serveur indique au navigateur que le document est en us-ascii.
- en fin de processus, il faut que le navigateur qui va traiter le document sache gérer ce charset. Il est inutile d'attendre d'IE3.0 qu'il affiche correctement un document en utf-32.
- toujours en fin de processus, il faut également que le navigateur puisse établir la correspondance entre le caractère et une
police de caractères disponible localement, dans laquelle le glyphe correspondant existe : il est impossible par exemple d'afficher des caractères de l'alphabet arabe en police "Times Roman". La feuille de style CSS doit donc préciser des polices pertinentes (Les navigateurs graphiques modernes sont plus ou moins aptes à récupérer ce type d'erreur).
Modifié par Laurent Denis (21 Aug 2005 - 09:54)