Zeichencodierungen in Expression Web

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.

UTF-8 als Standardcodierung

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:

Was ist ein BOM?

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.

Potentielle Probleme

Abweichende Zeichencodierung im HTTP-Header

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.

Includes bei PHP und SSI

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.

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:

Textdateien (.txt, .css)

  1. Öffnen Sie die Textdatei in Expression Web.
  2. Klicken Sie mit der rechten Maustaste in den Anzeigebereich und wählen Sie Codierung… aus dem Kontextmenü.
  3. Im Dialog „Textdateicodierung“ wählen Sie aus der unteren Liste („Aktuelle Datei speichern unter:“) „US/Westeuropäisch (ISO)“ oder „US/Westeuropäisch (Windows)“ aus.
  4. Klicken Sie auf Speichern unter… und überschreiben Sie die bestehende Datei.

Vollständige HTML-Dokumente

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:

  1. Öffnen Sie die HTML-Datei in Expression Web.
  2. Wählen Sie aus dem Menü Datei → Eigenschaften….
  3. Wechseln Sie zur Registerkarte „Sprache“.
  4. Im Dialog „Textdateicodierung“ wählen Sie aus der zweiten Liste („Dokument speichern als:“) „US/Westeuropäisch (ISO)“ oder „US/Westeuropäisch (Windows)“ aus.

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:

  1. Öffnen Sie die entsprechende Website.
  2. Wählen Sie aus dem Menü Website → Websiteeinstellungen….
  3. Wechseln Sie zur Registerkarte „Sprache“.
  4. Wählen Sie die gewünschte Zeichencodierung aus der Liste „Standardseitencodierung“ aus.

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

Unvollständige HTML-Dokumente

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:

  1. Öffnen Sie die Datei in der Quellcode-Ansicht.
  2. Fügen Sie folgenden Code möglichst am Anfang der Datei, aber nach Anweisungen wie 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 */ ?>

Expression Web 2

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: