it-swarm.com.de

Wie kann ich dem Browser die Zeichenkodierung einer HTML-Website unabhängig vom Header des Serverinhaltstyps mitteilen?

Ich habe eine HTML-Seite, die korrekt (die Codierung des physischen Datenträgers stimmt überein) mit 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> ...

Das Öffnen der Datei von der Festplatte im Browser (Google Chrome, Firefox) funktioniert einwandfrei.

Der Webserver fordert ihn über HTTP an und sendet einen anderen Content-Type-Header:

$ 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

(siehe letzte Zeile). Der Browser zeigt dann mit ISO-8859-1 das unerwünschte Ergebnis an.

Gibt es eine übliche Möglichkeit, die vom HTML-Dokument an den Browser gesendeten Server-Header zu überschreiben?

9
hakre

"Gibt es eine übliche Möglichkeit, die vom HTML-Dokument an den Browser gesendeten Server-Header zu überschreiben?"

AFAIK nein, du tust was du schon kannst. Der definierte Zeichensatz über Header übertrifft Ihre Definition im META-Tag.

Wenn Sie Zugriff auf den Server haben, z. Apache, es wird durch diese Anweisung konfiguriert (siehe die Kommentarzeilen):

# 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

[Aktualisieren]

Zum zweiten Kommentar von w3d hier finden Sie einige Möglichkeiten, den Zeichensatz über htaccess-Direktiven für den Apache-Server zu ändern.

6
initall

Sie sollten so etwas in Ihrem root .htaccess einstellen

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

Nein, das ist im HTML nicht möglich. Der Antwortheader des Servers hat Vorrang vor dem Meta-Tag des Dokuments. Wie in angegeben 5.2.2 Festlegen der Zeichenkodierung - HTML 4.01-Spezifikation :

Zusammenfassend gesagt müssen konforme Benutzerprogramme bei der Bestimmung der Zeichenkodierung eines Dokuments die folgenden Prioritäten beachten (von der höchsten zur niedrigsten Priorität):

  1. Ein HTTP "Zeichensatz" -Parameter in einem "Content-Type" -Feld.
  2. Eine META-Deklaration, bei der "http-equiv" auf "Content-Type" und ein Wert für "charset" festgelegt ist.
  3. Das Zeichensatzattribut, das für ein Element festgelegt wird, das eine externe Ressource bezeichnet.

Dies erfordert also eine Konfiguration auf der Serverseite. Wie auch immer, wie das Kapitel weitergeht:

Benutzerprogramme bieten möglicherweise einen Mechanismus, mit dem Benutzer falsche Zeichensatzinformationen überschreiben können. Wenn ein Benutzerprogramm jedoch einen solchen Mechanismus anbietet, sollte es nur zum Durchsuchen und nicht zum Bearbeiten angeboten werden, um die Erstellung von Webseiten zu vermeiden, die mit einem falschen "Zeichensatz" -Parameter gekennzeichnet sind.

In meinem Fall enthält der Content-Type -Header des Servers den richtigen MIME-Type, aber den falschen Zeichensatz.

Wie sich herausstellte, hatte meine Apache-httpd-Konfiguration die Option AddDefaultCharset aktiviert, die den Teil ; charset=ISO-8859-1 hinzufügte. In das Stammverzeichnis der Website .htaccess die folgende Zeile einfügen:

AddDefaultCharset Off

die Zeichensatzinformationen wurden entfernt:

$ 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

(Siehe letzte Zeile, kein Teil von ; charset=...). In Kombination mit dem HTML-Meta-Tag löst dies aus, dass die besagten Browser-Heuristiken das Zeichensatz vom Meta-Tag übernehmen. Die Website ist richtig dekodiert.

Getestet mit:

  • Google Chrome v. 22.0.1229.94
  • Firefox v. 16.0.1
  • Lynx Version 2.8.7rel.1 (05 Jul 2009)

Diese drei Browser hatten Probleme mit der ursprünglichen Konfiguration und funktionieren jetzt (alle auf Fedora 17).

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

Hatte das Problem überhaupt nicht. Beide bevorzugten TF-8 vom Meta-Tag gegenüber ISO-8859-1 vom Server.

  • Netscape 2.01 Gold

Unterstützt UTF-8 nicht und wählt daher immer Western (Latin1), unabhängig von der Servereinstellung und dem Meta-Tag.

3
hakre

Zusätzlich zu dem, was hier gesagt wurde, würde ich versuchen, auf allen Seiten den gleichen Zeichensatz zu verwenden - vorzugsweise UTF-8 (aber wenn fast alles iso-8859-1 ist, verwende dies).

Um den Zeichensatz einer Datei schnell zu überprüfen, können Sie versuchen:

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

Um den Zeichensatz aller Dateien im Baum zu überprüfen, können Sie versuchen:

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

oder (Aufruf des Befehls file nur einmal):

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

Um eine Zusammenfassung zu erhalten, verwenden Sie die Option -b für den Befehl file (um die Dateinamen wegzulassen) und leiten Sie das Ergebnis an sort | uniq -c weiter.

1
Tobias