Unicode (UTF-8) und HTML

Ohne Anspruch auf Vollständigkeit... :-)

Wir im "westlichen" Europa gehen meist davon aus, dass die von uns eingegebenen Zeichen vom Anseher unserer Webseiten gleich gesehen werden. Dabei ist es eigentlich nicht selbstverständlich, dass das von uns verwendete Encoding (iso-8859-1, -15) auch auf dem Zielsystem verwendet wird.
Man könnte auch sagen, solange Leute die Seite lesen, die im gleichen Land wie wir wohnen, gibt es kaum Probleme. Wenn man jedoch international kompatibel sein will, sollte man doch etwas genauer auf die Codierung seiner Webseiten achten.

Die Information, welcher Charset bei der Erstellung (und Ansicht) einer Webseite verwendet wurde, gehört im Normalfall als META-Tag in den HEAD-Bereich des HTML-Dokuments:

z.B.:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
  <title>Der Titel</title>
</head>
<body>
...
</body>
</html>

Natürlich MUSS es nicht utf-8 sein :-).
(Weitere Doctypes findet man z.B. auf http://www.htmlhelp.com/tools/validator/doctype.html)

Es gibt allerdings Fälle, in denen ein Browser trotz dieser Meta-Information einen anderen Charset verwendet: Wenn der Webserver einen Charset vorgibt, ignoriert der Browser (z.B. Mozilla 1.4) den Meta-Tag.

Bei Apache ist das Kommando "AddDefaultCharset" Verhalten zuständig. Um heraus zu finden, ob ein Webserver den Charset vorgibt oder nicht, reicht eine Abfrage der HTTP-Header - Informationen.

Beispiel für einen Server mit Charset-Vorgabe:

tjabo@kloppfix1:~$ wget -S --spider http://www.xxxxxxxxxxx.de/
--20:46:54--  http://www.xxxxxxxxxxx.de/
           => `index.html'
Auflösen des Hostnamen »www.xxxxxxxxxxx.de«.... fertig.
Verbindungsaufbau zu www.xxxxxxxxxxxx.e[xxx.yyy.zzz.ttt]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort...
 1 HTTP/1.1 200 OK
 2 Date: Fri, 29 Aug 2003 18:47:53 GMT
 3 Server: Apache/x.x.xx xxxxxxxxxxxxxxxxxxxxxxx
 4 X-Powered-By: PHP/4.3.1
 5 Set-Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
 6 Expires: Thu, 19 Nov 1981 08:52:00 GMT
 7 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
 8 Pragma: no-cache
 9 ...
10 Keep-Alive: timeout=10, max=20
11 Connection: Keep-Alive
12 Content-Type: text/html; charset=ISO-8859-1
200 OK

Dieser Server gibt offensichtlich ein Charset vor - es ist also nicht möglich, einen Browser wie Mozilla 1.4 dazu zu bringen, UTF-8-Codes korrekt darzustellen.

Anders hier:

wget -S --spider http://www.xxxxxxx.de/

HTTP Anforderung gesendet, warte auf Antwort...
 1 HTTP/1.1 200 OK
 2 Date: Fri, 29 Aug 2003 18:41:40 GMT
 3 Server: Apache/x.x.xx (Unix) mod_fastcgi/2.2.12 AuthMySQL/2.20 PHP/4.2.2 mod_ssl/2.8.10 OpenSSL/0.9.6b
 4 X-Powered-By: PHP/4.2.2
 5 Keep-Alive: timeout=15, max=50
 6 Connection: Keep-Alive
7 Content-Type: text/html
200 OK

Hier ist es optimal -- der Webserver gibt kein Encoding vor.

Diese Webseite hier ist ürigens auch in UTF-8 codiert.