HTML und XHTML ausliefern

Dieser Artikel gibt eine kurze Einführung, wie Server HTML und XHTML an ein Nutzerprogramm (z.B. einen Browser) senden und wie gängige Nutzerprogramme den empfangenen Quelltext verarbeiten. Das Augenmerk liegt dabei eher auf Implementierungen als auf W3C-Standards.

Daraus ergibt sich, wie die Zeichencodierung eines HTML- oder XHTML-Dokuments anzugeben ist. Außerdem wird erklärt, warum einige CSS-Stil-Angaben nicht wie erwartet wirken und die Darstellung von Browser zu Browser variiert.

Medientypen (MIME-Typen)

Wenn ein Server ein Dokument an einen Browser ausliefert (sendet), dann sendet er auch zusätzliche Informationen mit – im sogenannten HTTP-Header.

Das Content-Type-Feld des HTTP-Headers gibt an, um welches Datenformat es sich handelt. Diese Infomation wird durch den Medientypen (MIME-Typen) augedrückt. Es folgt ein Beispiel eines HTTP-Headers einer HTML-Datei mit dem Medientypen text/html. Die Content-Type-Angabe kann auch die Zeichencodierung des Dokuments 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

Der übliche Medientyp für HTML-Dateien ist text/html. Ein Browser, der eine Datei mit diesem Medientypen empfängt, wird annehmen, dass das Markup der HTML-Syntax entspricht, und einen HTML-Parser verwenden, um die Bedeutung des Markups zu interpretieren.

Im Gegensatz zu HTML ist XHTML eine XML-basierte Auszeichnungssprache. Die Syntax von XML unterscheidet sich leicht von der von HTML, und XML-Prozessoren sind weniger fehlertolerant. Bei der XML-basierten Entwicklung von Inhalten wird großer Wert auf Wohlgeformtheit und Validität (Gültigkeit) gelegt und man hat Zugang zu allen Verarbeitungstools, Daten und Automatisierungen der XML-Welt. Viele Entwickler bevorzugen XHTML wegen der Vorteile, die die Strenge von XML beim Bearbeiten oder Verarbeiten der Dokumente mit sich bringt.

Um XHTML-Markup mit einem Medientypen, der angibt, dass es sich um XML handelt, an einen Browser zu senden, ist einer der folgenden Medientypen zu verwenden: application/xhtml+xml, application/xml oder text/xml. Das W3C empfiehlt zur Auslieferung von XHTML als XML nur den ersten dieser Medientypen zu verwenden, d.h. application/xhtml+xml.

Wenn ein Browser XML verarbeitet, verwendet er einen XML-Parser, keinen HTML-Parser.

Leider unterstützt der Internet Explorer bis einschließlich Version 8 keine als XML ausgelieferten Dateien wie es eine Reihe anderer Browser tut. Um das Problem zu umgehen, dass nicht alle Browser als XML ausgelieferte Inhalte unterstützen, werden viele XHTML-1.0-Dateien mit dem Medientypen text/html ausgeliefert. In diesem Fall behandelt ein Nutzerprogramm die Datei wie HTML und nutzt den HTML-Parser.

Wenn ein Browser XML als HTML ansieht, muss man beim Verfassen des XHTML-Codes einige Unterschiede zwischen den beiden Formaten beachten um sicherzugehen, dass die Syntax-Unterschiede zwischen XML und HTML den Browser nicht aus dem Konzept bringen. Dazu zählen die unterschiedlichen Arten der Angaben der Zeichencodierung und der Sprache im Dokument.

Anhang C der XHTML-Spezifikation empfielt einige Kompatibilitäts-Richtlinien, wenn man XHTML als HTML ausliefert. Diese Kompatibilitäts-Richtlinien sind besonders wichtig für veraltete Browserversionen. Sie empfehlen u.a., ein Leerzeichen vor dem '/>' im Tag eines leeren Elements (wie img, hr oder br) zu setzen, sowohl das HTML-Attribut lang als auch das XML-Attribut xml:lang anzugeben und sowohl das id- als auch das name-Attribut bei Fragmentbezeichnern zu verwenden.

Standard- vs. Quirks-Modus

Gegenwärtig gängige Browser können eine HTML-Datei im Standard-Modus oder im Quirks-Modus darstellen. Das bedeutet, dass verschiedene Regeln angewandt werden, um die Datei darzustellen: entweder konform zu dem erwarteten Verhalten nach den W3C-Standards oder konform zu den Erwartungen anhand des Nicht-Standard-Verhaltens von älteren Browsern.

Die neueren Versionen der gängigen Browser schalten bei einer vorhandenen DOCTYPE-Deklaration in den Standard-Modus. Ein fehlender DOCTYPE kann zu unterschiedlichem Rendering in verschiedenen Browsern führen.

Die folgenden Screenshots zeigen einige dieser Unterschiede auf:

Bild eines im Standard-Modus gerenderten Dokuments.
Ein im Standard-Modus gerendertes Dokument.
Bild desselben Dokuments im Quirks-Modus gerendert.
Dasselbe Dokument im Quirks-Modus gerendert.

Clicken Sie auf die Bilder, um die HTML-Seiten zu öffnen. Im Internet Explorer sieht man den Effekt.

Diese zwei Bilder zeigen dieselbe Seite mit exakt demselbem Markup und demselben Stylesheet. Der einzige Unterschied zwischen beiden Dateien besteht darin, dass in der linken ein DOCTYPE am Anfang des Quelltextes steht, in der rechten nicht. Eine Datei mit einer geeigneten DOCTYPE-Deklaration sollte in den neusten Versionen aller Browser im Standard-Modus gerendert werden. Kein DOCTYPE ergibt Quirks.

Die eben gezeigten Unterschiede resultieren aus unterschiedlichen Implementierungen in Browsern wie dem Internet Explorer:

Ursprünglich war der DOCTYPE lediglich dazu bestimmt, die Auszeichnungssprache anzugeben. Das folgende Beispiel zeigt einen Quelltext mit DOCTYPE-Deklaration am Anfang (rot und kursiv hervorgehoben):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>XHTML document</title> 
    <style type="text/css">
    body { background: white; color: black; font-family: arial, sans-serif; font-size: 12px; }
    p { font-size: 100%; }
    h1 { font-size: 16px; }
    div { margin: 20px; width: 170px; padding: 50px; border: 6px solid teal; }
    table { border: 1px solid teal; }
    </style> 
    </head> 

<body> 
    <h1>Test file for Standards/Quirks</h1> 
    <div>
        A div with CSS width:170px, margin:20px, padding:50px and border:6px.
        </div> 
    <p>Text in a p element.</p>
    <table> 
        <tr><td>Text in a table.</td></tr> 
        </table>
    </body> 
</html> 
			

Das Umschalten zwischen Standard- und Quirks-Modus nennt man auch DOCTYPE-Switching.

Es ist generell angebracht, die Seiten im Standard-Modus auszuliefern, also eine DOCTYPE-Deklaration einzufügen.

Die XML-Deklaration und DOCTYPEs

Ein Punkt ist bei der Verwendung von DOCTYPEs besonders wichtig für die Angabe der Zeichencodierung und für vorhersehbare Darstellungsergebnisse.

Weil XHTML 1.0 auf XML basiert, ist es möglich, eine XML-Deklaration am Dateianfang hinzuzufügen, auch wenn es als HTML ausgeliefert wird. Damit sieht der Anfang der obigen Datei so aus (XML-Deklaration rot und kursiv hervorgehoben):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xml‎ns="http://www.w3.org/1999/xhtml">
<head>
...

In Browsern wie Internet Explorer 7, Firefox, Safari, Opera, Google Chrome u.a. wird eine Seite sowohl mit als auch ohne XML-Deklaration, jedoch mit DOCTYPE-Deklaration, im Standard-Modus gerendert.

Im Internet Explorer 6 jedoch wird, wenn vor der DOCTYPE-Deklaration noch irgendetwas anderes außer einem BOM steht, die Seite im Quirks-Modus gerendert.

Wenn die Nutzer des Internet Explorer 6 immer noch einen signifikanten Anteil des Zielpublikums ausmachen könnten, sollte dieses Problem bedacht werden. Wenn alle Seiten genauso wie in allen anderen, standardkonformen Browsern dargestellt werden sollen, muss darüber nachgedacht werden, wie das zu lösen ist.

Wenn das Dokument keine Konstrukte enthält, die von den Unterschieden zwischen Standard- und Quirks-Modus beeinflusst werden, dann gibt es kein Problem. Wenn dies allerdings nicht der Fall ist, muss man Workarounds im CSS hinzufügen, um die Unterschiede auszugleichen; oder die XML-Deklaration weglassen.

Wenn man sich dafür entscheidet, die XML-Deklaration wegzulassen, sollte man als Zeichencodierung für die Seite entweder UTF-8 oder UTF-16 wählen. (Siehe Angabe der Zeichencodierung in HTML für weitere Informationen zum Einfluss der Deklaration der Zeichencodierung.)