Viele Anwender, die von FrontPage zu Expression Web wechseln, stellen fest, daß Nicht-ASCII-Zeichen wie etwa die deutschen Umlaute im Editor oder im Browser nicht korrekt dargestellt werden oder unerklärlicherweise der Text

am Anfang der Seite angezeigt wird. Das muß nicht sein, denn xWeb besitzt eine ausgezeichnete Unterstützung für eine Vielzahl von Zeichencodierungen. Dieses Dokument beschreibt, wie Sie mit denen sicher umgehen.
Alle FrontPage-Versionen verwenden standardmäßig eine ANSI-Codierung, bspw. Windows-1252. Expression Web verwendet hingegen UTF-8 als Standardcodierung. Mehrere Gründe sprechen für diese Entscheidung:
€
statt
€
oder
€
! Selbst ausgefallene Zeichen wie
→
oder
α
können Sie direkt im Quellcode notieren. Natürlich brauchen Sie einen Font, der Glyphen für diese Zeichen enthält, aber den brauchen Sie auch, wenn Sie stattdessen numerische Zeichenreferenzen verwendeten.
α
schreiben. Ohne UTF-8 bräuchte man in HTML
α
oder
α
, in CSS
\0003B1
, in Visual Basic .NET
ChrW(&H3B1)
, in JavaScript
\u03B1
.
Suum cuique.
Ein
byte-order mark oder
BOM ist diejenige Byte-Sequenz, die entsteht, wenn man das Unicode-Zeichen U+FEFF ZERO WIDTH NON-BREAKING SPACE mit einer UTF-Codierung codiert. Ein BOM kann somit verwendet werden, um festzustellen, ob eine Datei mit UTF-7, UTF-8, UTF-16 oder UTF-32 codiert ist, ohne auf externe Codierungsdeklarationen wie MIME- oder HTTP-Header oder vom Inhaltstyp abhängige Deklarationen wie die
@charset
-Regel in CSS zurückgreifen zu müssen. Ein BOM kann für alle Dateien verwendet werden, die Text enthalten. Die Auswertung eines BOMs ist trivial; es müssen lediglich die ersten paar Bytes der Datei gelesen werden. Aufwendiges Parsing entfällt.
Einige Webserver, insbesonde Apache 2.0, setzen standardmäßig den
charset
-Parameter des HTTP-
Content-Type
-Headers auf
iso-8859-1
. Das ist zwar gut gemeint, aber völlig schwachsinnig. Warum, erklärt Martin Dürst mit
überzeugender Argumentation.
Überprüfen Sie die HTTP-Header, die Ihr Server schickt, bspw. mit dem ausgezeichneten
Web-Sniffer. Sprechen Sie mit Ihrem Provider, wenn dort ein Header
Content-Type: text/html; charset=iso-8859-1
erscheint, den Sie nicht selbst gesetzt haben.
Der Include-Mechanismus von PHP und SSI ist sehr einfach; eine Anpassung der Zeichencodierung oder von Pfaden findet dabei nicht statt. Enthält die eingeschlossene Seite ein BOM, so erscheint dieses BOM mitten in der
„fertigen“ Seite, wo es natürlich nichts zu suchen hat und möglicherweise als

angezeigt wird. In Include-Dateien müssen Sie das BOM entfernen.
Expression Web erzeugt für UTF-8-codierte Dateien stets ein BOM. Um zu verhindern, daß ein BOM erzeugt wird, muß also die Zeichencodierung der Datei geändert werden, bspw. in ISO-8859-1 oder Windows-1252. Das Vorgehen hängt vom Dateityp ab:
Wenn Ihr HTML-Dokument ein Element wie
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
enthält, gehen Sie folgendermaßen vor:
Expression Web ändert daraufhin die Codierungsdeklaration und paßt auch die tatsächliche Codierung der Datei an.
Sie möchten möglicherweise auch die Zeichencodierung ändern, die für neue Seiten verwendet wird. Gehen Sie dazu folgendermaßen vor:
Diese Einstellung gilt für
neue Seiten, die in der
aktuellen Website erstellt werden. Die Codierung existierender Seiten wird dadurch nicht beeinflußt. Auf keinen Fall sollten Sie versuchen, durch Suchen und Ersetzen das entsprechende
meta
-Element zu ändern. Schlimmstenfalls wird die tatsächliche Codierung nicht angepaßt und widerspricht dann der deklarierten Codierung. Sicherer ist dieses Makro, das ich ursprünglich für FrontPage 2003 geschrieben habe. Es ändert die Codierung aller Seiten in der aktuellen Website:
Sub ChangeEncoding()
Dim wf As WebFile
Dim pw As PageWindow
For Each wf In ActiveWeb.AllFiles
'Process .html and .htm files only.
If wf.Extension <> "html" And wf.Extension <> "htm" Then GoTo NextFile
Set pw = wf.Edit(PageViewNoWindow)
'Search for existing encoding declaration.
Dim meta As MetaElement
For Each meta In pw.Document.all.tags("head")(0).all.tags("meta")
If meta.httpEquiv = "Content-Type" Then Exit For
Next
'No encoding declaration found, create a new one.
If meta Is Nothing Then
pw.Document.all.tags("head")(0).insertAdjacentHTML "AfterBegin", "<meta />"
Set meta = pw.Document.all.tags("head")(0).all.tags("meta")(0)
End If
With meta
.httpEquiv = "Content-Type"
.content = "text/html"
.Charset = "windows-1252"
End With
pw.Document.documentHTML = pw.Document.documentHTML
pw.Save
pw.Close
NextFile:
Next
End Sub
Wenn Ihre Datei kein vollständiges HTML-Dokument ist, weil sie mittels PHP oder SSI in eine andere Seite eingeschlossen werden soll und deshalb kein Element wie
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
enthält, müssen Sie zu einem Trick greifen:
session_start();
ein:
<!-->
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<!-->
Es handelt sich dabei um einen gültigen HTML-Kommentar, d.h. die Darstellung im Browser wird nicht verändert. Expression Web erkennt in diesem Kommentar trotzdem eine Codierungsdeklaration und speichert die Datei deshalb Windows-1252-codiert ab. Ein BOM wird somit nicht erzeugt.
In PHP können Sie diesen Ansatz sogar so modifizieren, daß der Client den Code überhaupt nicht sieht:
<?php /* ?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<?php */ ?>
Bei Expression Web 2, das demnächst auch in der deutschen Ausgabe erscheinen wird, wurden einige Änderungen vorgenommen, um etwa die PHP-Unterstützung zu verbessern:
meta
-Element werden nun stets ANSI-codiert gespeichert. Da Dateien ohne Codierungsdeklaration weiterhin mit der unter
Website Websiteeinstellungen… Sprache Standardseitencodierung angegebenen Codierung geöffnet werden, müssen Sie dort
„US/Westeuropäisch (Windows)“ auswählen, wenn Sie mit .php-Dateien arbeiten – andernfalls gehen Nicht-ASCII-Zeichen beim Öffnen einer .php-Datei verloren. .php-Dateien, die nicht zu einer Website gehören, werden korrekt mit ANSI decodiert.
meta
-Element werden nun mit der unter
Website Websiteeinstellungen… Sprache Standardseitencodierung angegebenen Codierung gespeichert. Bislang wurde in diesem Fall stets UTF-8 verwendet.