Einstellung der Zeichencodierungsangabe ('charset') in .htaccess

Frage

Wie verwendet man .htaccess-Direktiven bei einem Apache-Server, um Dateien mit einer bestimmten Zeichencodierung auszuliefern?

Hintergrund

Es ist wichtig, dafür zu sorgen, dass sämtliche Angaben des Servers über die Zeichencodierung korrekt sind, denn die Angaben im HTTP-Header überschreiben die im Dokument vorhandenen Angaben.

Viele Apache-Server sind so konfiguriert, dass sie Dateien mit der Codierung ISO 8859-1 (Latin-1) ausliefern. In den Beispielen dieser FAQ gehen wir davon aus, dass eine oder mehrere Dateien mit einer anderen Codierung als der in Grundeinstellung festgelegten ausgeliefert werden sollen. (Für Hinweise zur Wahl der Zeichencodierung siehe das Tutorial Zeichensätze und Zeichencodierungen in XHTML, HTML und CSS.)

Es folgt ein Beispiel eines HTTP-Headers, der zu einer an ein Nutzerprogramm (einen Browser) gesendeten Datei gehört. In diesem Fall ist die Angabe der Zeichencodierung im Content-Type-Header in der vorletzten Zeile enthalten.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

In diesem Beispiel gibt der Content-Type-Header sowohl den Medientypen (MIME-Typen) der Datei als auch die Zeichencodierung an. Der Medientyp beschreibt das Format der gesendeten Datei. HTML-Dateien werden üblicherweise als text/html ausgeliefert. Die Zeichencodierung ('charset'*) dieser Datei ist UTF-8.

'charset' steht hier nicht für Zeichensatz, sondern für Zeichencodierung. Beide Begriffe sollten sorgfältig unterschieden werden. (Anmerkung des Übersetzers)

Wie man Einblick in den HTTP-Header erhält, ist im Artikel HTTP-Header überprüfen beschrieben.

Dateien auf einem Apache-Server werden eventuell mit einer Zeichencodierungsangabe im HTTP-Herader ausgeliefert, die nicht der wirklichen Zeichencodierung der Datei entspricht. Die vom Server gesendete Codierung kann die bei der Serverinstallation gesetzte Grundeinstellung, eine vom Systemadministrator gesetzte Grundeinstellung oder das Ergebnis verschiedener Apache-Direktiven sein. In anderen Fällen wird gar keine Zeichencodierungsangabe vom Server gesendet, obwohl es erforderlich wäre.

Wenn der Server so eingerichtet ist, dass er es Nutzern oder Administratoren erlaubt, Angaben in .htaccess-Dateien zu ändern, können diese Angaben die Grundeinstellungen überschreiben. Diese FAQ zeigt, wie.

Antwort

Verschiedene Szenarien sind zu berücksichtigen. Zum einen könnte gewünscht sein, die Einstellung für alle Dateien mit derselben Datei-Endung in einem Verzeichnis zu ändern. Oder es soll die Einstellung für eine einzelne oder wenige Dateien geändert werden. Wir werden dies nacheinander durchgehen.

In unseren Beispielen nehmen wir an, dass der Server per Grundeinstellung Dateien als ISO 8859-1 ausliefert, aber gewünscht ist, dass die Datei(en) als UTF-8 ausgeliefert werden. (Eine äußerst vernünftige Strategie!)

Ist diese Antwort für mich von Bedeutung?

Dieser Artikel ist eher für Seitenautoren als für Systemadministratoren geschrieben. Die Grundeinstellung des Servers zu setzen, ist nicht Teil dieses Artikels.

Die hier gegebenen Ratschläge sind nur von Bedeutung, wenn die Zeichencodierung der Dokumente im HTTP-Header angegeben werden soll. In einigen Fällen ist das nicht angebracht.

Diese FAQ geht davon aus, dass der Server .htacces-Dateien verwendet und dass die im Folgenden genannten Direktiven in .htaccess-Dateien auf dem Server auch Wirkung zeigen. Weiterhin wird davon ausgegangen, dass nicht einfach die Grundeinstellung des Servers geändert werden kann. Im Zweifelsfall sollte der Server-Administrator kontaktiert werden.

Zu beachten sind auch die auf dem Server verwendeten Konventionen zur Verknüpfung von Zeichencodierungsangaben mit Datei-Endungen. In manchen Fällen könnte der Server so eingestellt sein, dass er spezifische Endungen für die Zeichencodierungen erwartet, z.B. example.html.utf8; wobei es das .utf8 ist, was mit einer Zeichencodierung zu verknüpfen ist, nicht das .html (was mit dem Dateitypen verknüpft sein kann).

Wenn diese Ansätze scheitern, sollte die Apache-Dokumentation (siehe Links) oder der Server-Administrator konsultiert werden.

Festlegung anhand der Datei-Endung

Mit der AddCharset-Direktive wird eine Zeichencodierung mit allen Dateien mit einer bestimmten Datei-Endung im aktuellen Verzeichnis und allen Unterverzeichnissen verknüpft. Um beispielsweise alle Dateien mit der Endung .html als UTF-8 auszuliefern, ist die .htaccess-Datei in einem Texteditor zu öffnen und folgende Zeile einzutragen:

AddCharset UTF-8 .html

Die Datei-Endung kann mit oder ohne Punkt am Anfang angegeben werden. Es können mehrere Endungen in derselben Zeile hintereinander stehen. Dies funktioniert auch, wenn die Dateinamen die Form example.en.html oder example.html.en haben.

Dieses Beispiel führt dazu, dass alle Dateien mit der Endung .html als UTF-8 ausgeliefert werden. Der HTTP-Content-Type-Header enthält dann eine Zeile mit der Zeichencodierungsangabe am Ende, wie im folgenden Beispiel:

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

Anmerkung: Dann werden auch alle Dateien mit dieser Endung in allen Unterverzeichnissen des aktuellen Verzeichnisses als UTF-8 ausgeliefert. Soll aus irgendeinem Grund eine Datei ausnahmsweise mit einer anderen Codierung ausgeliefert werden, ist diese Angabe durch zusätzliche Direktiven zu überschreiben.

Anmerkung: Man kann die Zeichencodierung mit jeder Datei-Endung verknüpfen. Angenommen, es wird Sprachvereinbarung (language negotiation) durchgeführt und es gibt Seiten in zwei Sprachen: example.en.html und example.ja.html. Nehmen wir weiterhin an, dass die englischen Seiten in der Server-Grundeinstellung ISO 8859-1 ausgeliefert werden sollen, die japanischen aber in UTF-8. Um das zu erreichen, kann die Zeichencodierung mit der Sprach-Erweiterung wie folgt verknüpft werden:

AddCharset UTF-8 .ja

Zu beachten ist dabei jedoch, dass es die bessere Lösung sein dürfte, möglichst die Server-Grundeinstellung auf UTF-8 zu ändern oder alle Dateien in neuen Verzeichnissen als UTF-8 auszuliefern.

Anmerkung: Dasselbe Ergebnis kann auch mit der AddType-Direktive erreicht werden, die jedoch gleichzeitig die Zeichencodierung und den Medientypen angibt. Die Entscheidung, was am besten geeignet ist, hängt unter anderem davon ab, wie Datei-Endungen für Inhaltsvereinbarung (content negotiation) genutzt werden. Wenn verschiedene Datei-Endungen für Dokumenttypen und Zeichencodierung genutzt werden, ist dies wahrscheinlich weniger geeignet.

AddType 'text/html; charset=UTF-8' html

Änderung für einzelne Dateien

Nehmen wir nun an, dass eine einzelne Datei aus einem großen Verzeichnis als UTF-8 ausgeliefert werden soll, während alle anderen älteren Dateien korrekt als ISO 8859-1 ausgeliefert werden sollen. Die als UTF-8 auszuliefernde Datei sei example.html. Dann die .htaccess-Datei in einem Texteditor öffnen und folgendes eintragen:

<Files "example.html">
AddCharset UTF-8 .html
</Files>

Damit haben wir die im vorigen Abschnitt besprochene Direktive in Tags einzuhüllt, die die entsprechende Datei angeben. Falls erforderlich, gibt es auch eine etwas andere Syntax, die es mithilfe eines regulären Ausdrucks erlaubt, mehrere Dateien anzugeben.

Anmerkung: Dasselbe Ergebnis kann auch mit der oben genannten AddType-Direktive erreicht werden oder in diesem Fall auch mit der ForceType-Direktive, wobei beide sowohl die Zeichencodierung als auch den Medientypen angeben.

<Files "example.html">
ForceType 'text/html; charset=UTF-8'
</Files>

Anmerkung: Alle Dateien mit demselben Namen in Unterverzeichnissen des aktuellen Verzeichnisses werden dann auch als UTF-8 ausgeliefert, wenn nicht in dem betreffenden Unterverzeichnis eine gegenteilige Direktive zur Anwendung kommt.

Komplexere Szenarien

Wenn Regeln für zwei Datei-Endungen auf dasselbe Dokument zutreffen, ist die Reihenfolge der Endungen entscheidend. Im folgenden Beispiel

AddCharset UTF-8 .utf8
AddCharset windows-1252 .html

wird die Datei 'example.utf8.html' als "windows-1252" ausgeliefert und 'example.html.utf8' als UTF-8.