Comment indiquer au navigateur l'encodage de caractères d'un site Web HTML indépendamment de l'en-tête de type de contenu du serveur?


9

J'ai une page HTML qui annonce correctement (l'encodage du physique sur le disque) annonce son Content-Type :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

L'ouverture du fichier à partir du disque dans le navigateur (Google Chrome, Firefox) fonctionne bien.

En le demandant via HTTP, le serveur Web envoie un en-tête Content-Type différent:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(voir dernière ligne). Le navigateur utilise ensuite ISO-8859-1 pour afficher ce qui est un résultat indésirable.

Existe-t-il un moyen courant de remplacer les en-têtes de serveur envoyés au navigateur depuis le document HTML?

Réponses:


6

"Existe-t-il un moyen courant de remplacer les en-têtes de serveur envoyés au navigateur depuis le document HTML?"

AFAIK non, vous faites déjà ce que vous pouvez faire. Le jeu de caractères défini via Header l'emporte sur votre définition dans la balise META.

Si vous avez accès au serveur, par exemple Apache, il est configuré par cette instruction (voir les lignes de commentaire):

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[Mise à jour]

Pour seconder le commentaire de w3d ici, vous trouverez quelques façons de changer le jeu de caractères via htaccess-Directives pour le serveur Apache.


2
+1 Les en-têtes HTTP remplacent les balises META HTML. Si @hakre a accès au côté serveur, ils peuvent également remplacer l'en-tête Content-Type page par page.
MrWhite

3
À droite, voici la référence normative qui spécifie que les en-têtes HTTP l' emportent sur les
Jukka K. Korpela

Merci d'avoir répondu. @Korpela: Oui, je l'avais en mémoire avec les spécifications HTML. C'est exactement l'inverse car j'en ai besoin :(.
hakre

En ce qui concerne .htaccess (désolé, cela devrait peut-être être une nouvelle question à la place), est-il possible de supprimer également l'en ;charset=...-tête http. Le site fonctionne très bien avec Content-Type: text/html, différents fichiers ont des encodages différents sur le serveur. (Je crains que ce ne soit pas possible aussi, car je pense que je l'ai cherché il y a quelques semaines mais le résultat n'était pas tout à fait définitif). Juste au cas où vous pourriez faire la lumière juste devant.
hakre

@hakre Si la directive ForceType d'Apache fonctionne pour vous, placez-la dans un conteneur <Files> et nommez individuellement les fichiers ou certains répertoires. Laissez simplement la partie "; charset =" après le type MIME, cela devrait le faire.
initall

3

Vous devez définir quelque chose comme ça dans votre racine .htaccess

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>

3

Non, ce n'est pas possible depuis le HTML. L'en-tête de réponse du serveur a priorité sur la méta-balise du document. Comme spécifié en 5.2.2 Spécification de l'encodage des caractères - Spécification HTML 4.01 :

Pour résumer, les agents utilisateurs conformes doivent respecter les priorités suivantes lors de la détermination du codage de caractères d'un document (de la priorité la plus élevée à la plus faible):

  1. Un paramètre HTTP "charset" dans un champ "Content-Type".
  2. Une déclaration META avec "http-equiv" défini sur "Content-Type" et une valeur définie pour "charset".
  3. L'attribut charset défini sur un élément qui désigne une ressource externe.

Cela nécessite donc une configuration côté serveur. Cependant, comme le chapitre continue:

Les agents utilisateurs peuvent fournir un mécanisme qui permet aux utilisateurs de remplacer les informations de "jeu de caractères" incorrectes. Cependant, si un agent utilisateur propose un tel mécanisme, il ne doit le proposer que pour la navigation et non pour l'édition, afin d'éviter la création de pages Web marquées avec un paramètre "charset" incorrect.

Dans mon cas, l'en - tête Content-Type du serveur contient le bon type MIME mais le mauvais jeu de caractères .

Il s'est avéré que ma configuration Apache httpd avait AddDefaultCharsetactivé la fonction qui ajoutait la ; charset=ISO-8859-1pièce. Placer dans le répertoire racine des sites Web .htaccessla ligne suivante:

AddDefaultCharset Off

les informations de jeu de caractères ont été supprimées:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(voir dernière ligne, aucune ; charset=...partie). Ceci, en combinaison avec la méta-balise html, déclenche l'heuristique dudit navigateur pour reprendre le jeu de caractères de la méta-balise. Le site Web est correctement décodé.

Testé avec:

  • Google Chrome v. 22.0.1229.94
  • Firefox v. 16.0.1
  • Lynx version 2.8.7rel.1 (5 juil.2009)

Ces trois navigateurs ont eu des problèmes avec la configuration d'origine et fonctionnent maintenant (tous sur Fedora 17).

  • Opera 12.02
  • Internet Explorer 6 (Win XP SP3)

N'a pas eu le problème en premier lieu. Les deux préféraient UTF-8 de la méta-étiquette au paramètre ISO-8859-1 du serveur.

  • Netscape 2.01 Gold

Ne prend pas en charge UTF-8 et choisit donc toujours Western (Latin1) quels que soient les paramètres du serveur et la balise META.


1

En plus de ce qui a été dit ici, j'essaierais d'utiliser le même jeu de caractères dans toutes les pages - de préférence UTF-8(mais si presque tout est iso-8859-1, utilisez-le).

Pour vérifier rapidement le jeu de caractères d'un fichier, vous pouvez essayer:

file --mime-type --mime-encoding {filename}

Pour vérifier le jeu de caractères de tous les fichiers de l'arborescence, vous pouvez essayer:

find . -type f -exec file --mime-type --mime-encoding '{}' \;

ou (en appelant la filecommande une seule fois):

find . -type f -print | file --mime-type --mime-encoding -f-

Pour obtenir un résumé, utilisez l' -boption de la filecommande (pour omettre les noms de fichiers) et dirigez le résultat vers sort | uniq -c.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.