UTF-8 in FrontPage 2000, 2002 und 2003

Microsoft hat seine öffentlichen Newsgroups (microsoft.public.de.*) zum 1. Juni 2010 abgeschaltet. Darunter fallen auch die bislang von mir betreuten Gruppen microsoft.public.de.frontpage und microsoft.public.de.expression.web.

Ich empfehle meinen Besuchern sowie allen Anwendern von FrontPage und Expression Web, in die deutschsprachige Webautoren-Newsgroup de.comm.infosystems.www.authoring.misc zu wechseln. Beachten Sie auch meine Ankündigung in den Newsgroups.

FrontPage unterstützt UTF-8 seit Version 97 und damit länger als die meisten anderen HTML-Editoren. Dieses Dokument beschreibt, wie die FrontPage-Versionen 2000, 2002 und 2003 UTF-8-codierte Dokumente erkennen und verarbeiten.

Lesen Sie Zeichencodierungen in Expression Web, wenn Sie den FrontPage-Nachfolger verwenden.

UTF-8 im WWW?

Ja, kein Problem. UTF-8 wird entgegen der Meinung vieler Webdesigner von fast allen Browsern hervorragend unterstützt, selbst Netscape 3.x kann man es per Eingriff in die Registry leicht beibringen. UTF-8 wird insbesondere von älteren Browsern sogar besser unterstützt als numerische Zeichen- oder Entity-Referenzen wie € oder €. Alan J. Flavell schreibt treffend:

The expected difficulties are not in the browsers, but in authors (mis)handling this unfamiliar data format.

Und FrontPage hilft gerade denen.

UTF-8 in FrontPage 2000

FrontPage 2000 erkennt UTF-8-codierte Dokumente ausschließlich anhand von <meta http-equiv="Content-Type" content="text/html; charset=utf-8">.

FrontPage 2000 unterstützt das UTF-8-BOM nicht. Ist ein BOM vorhanden, wird ein Dokument stets als Windows-1252 decodiert, selbst wenn ein meta-Element UTF-8 deklariert. Das BOM wird in den Rumpf der Seite verschoben und dort als  angezeigt. Beim Speichern verwendet FrontPage hingegen wieder UTF-8 und schreibt damit das Zeichen U+FEFF UTF-8-codiert in die Datei, aber eben nicht an den Anfang, wodurch das BOM zerstört wird.

Die XML-Deklaration <?xml version="1.0" encoding="utf-8"?> hat ebenfalls nicht den gewünschten Effekt. Sie wird nicht als Codierungsdeklaration herangezogen, zudem wandert sie wie das BOM in den Rumpf der Seite und damit unbrauchbar.

Wenn Sie also UTF-8 in FrontPage 2000 verwenden wollen, dürfen Sie das von FrontPage erzeugte meta-Element nicht entfernen. Verwenden Sie weder BOM noch XML-Deklaration.

UTF-8 in FrontPage 2002

Erkennung von UTF-8

  1. Jedes Dokument, das <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> enthält oder mit einem UTF-8-BOM beginnt, wird von FrontPage 2002 als UTF-8 verarbeitet. Das gilt auch, wenn es Byte-Sequenzen enthält, die in UTF-8 ungültig sind. Solche fehlerhaft codierte Zeichen erscheinen als ? im Quelltext.

  2. Ohne meta-Element oder BOM schaltet FrontPage stets auf Windows-1252. (Sie können dies anhand der Schriftart in der HTML-Ansicht erkennen; bei Windows-1252 wird eine Festbreitenschriftart verwendet, bei Unicode-Codierungen eine serifenlose Schriftart.)

    Wenn das Dokument allerdings mit einer XML-Deklaration <?xml version="1.0" encoding="utf-8"?> beginnt, so wird das Dokument wiederum als UTF-8 decodiert. Zeichen, die nicht im Windows-1252-Zeichensatz enthalten sind, können dann nicht in der HTML-Ansicht dargestellt werden. FrontPage codiert solche Zeichen deshalb um:

    • Zeichen, die nicht in Windows-1252 codierbar sind,  werden als als numerische Zeichenreferenz geschrieben.

      <?xml version="1.0" encoding="utf-8"?> 
      <html> 
      <head> 
      <title></title> 
      </head> 
      <body> 
      <h1>α</h1> 
      </body> 
      </html>

      mit UTF-8-codiertem „α“ wird deshalb als

      <?xml version="1.0" encoding="utf-8"?> 
      <html> 
      <head> 
      <title></title> 
      </head> 
      <body> 
      <h1>&#945;</h1> 
      </body> 
      </html>

      im Editor angezeigt.

    • Zeichen aus Windows-1252 werden „roh“ codiert.

      <?xml version="1.0" encoding="utf-8"?> 
      <html> 
      <head> 
      <title></title> 
      </head> 
      <body> 
      <h1>ä</h1> 
      </body> 
      </html>

      mit UTF-8-codiertem „ä“ wird korrekt nach Windows-1252 umcodiert, aber mit unveränderter XML-Deklaration abespeichert als

      <?xml version="1.0" encoding="utf-8"?> 
      <html> 
      <head> 
      <title></title> 
      </head> 
      <body> 
      <h1>ä</h1> 
      </body> 
      </html>

      mit Windows-1252-codiertem „ä“. Danach kann das Dokument deshalb nicht mehr korrekt geladen werden, denn aufgrund der XML-Deklaration geht FrontPage weiterhin von UTF-8 aus:

      <?xml version="1.0" encoding="utf-8"?> 
      <html> 
      <head> 
      <title></title> 
      </head> 
      <body> 
      <p>?/p> 
      </body> 
      </html>

    Sie sollten die XML-Deklaration <?xml version="1.0" encoding="utf-8"?> deshalb in FrontPage nicht verwenden. <?xml version="1.0" encoding="iso-8859-1"?> ist aber völlig unproblematisch, wenn Sie denn tatsächlich ISO-8859-1 benutzen.

  3. Ohne XML-Deklaration, BOM und entsprechendes meta-Element werden mögliche UTF-8-Sequenzen nicht als UTF-8, sondern als Windows-1252 interpretiert. FrontPage verhält sich hier glücklicherweise anders als Notepad.

Stabilität des BOM

FrontPage 2002 selbst erzeugt niemals ein BOM, ein vorhandenes BOM bleibt aber beim Speichern erhalten. Änderungen in der HTML-Ansicht löschen das BOM jedoch. Darunter fallen auch folgende Vorgänge:

Wenn Sie UTF-8 verwenden wollen, sollten Sie das von FrontPage erzeugte meta-Element nicht löschen. FrontPage erkennt UTF-8-codierte Dokumente zwar auch anhand von BOM und XML-Deklaration, diese Methoden sind aber höchst unzuverlässig.

UTF-8 in FrontPage 2003

FrontPage 2003 behandelt UTF-8 grundsätzlich wie FrontPage 2002. Allerdings bleibt ein vorhandenes BOM erhalten, auch bei Änderungen in der HTML-Ansicht. Deshalb können Sie in FrontPage 2003 das BOM als zuverlässige Codierungsdeklaration verwenden und auf das entsprechende meta-Element verzichten, nachdem Sie manuell ein BOM erzeugt haben.

BOMs mit VBA erkennen, erzeugen und entfernen

Ich verwende dafür folgende VBA-Prozeduren:

Option Explicit

Public Const UTF8_BOM = ""
Public Const UTF16BE_BOM = "þÿ"
Public Const UTF16LE_BOM = "ÿþ"

Const F As String = "C:\foo.txt"

Sub Has_Bom()

  Dim fso As New FileSystemObject
  Dim t As String
  t = fso.OpenTextFile(F, ForReading).ReadAll
  
  If Left(t, 3) = UTF8_BOM Then
    MsgBox "UTF-8-BOM erkannt!"
  ElseIf Left(t, 2) = UTF16BE_BOM Then
    MsgBox "UTF-16-BOM (Big Endian) erkannt!"
  ElseIf Left(t, 2) = UTF16LE_BOM Then
    MsgBox "UTF-16-BOM (Little Endian) erkannt!"
  Else
    MsgBox "Kein BOM erkannt!"
  End If

End Sub

Sub Delete_UTF8_Bom()

  Dim fso As New FileSystemObject
  Dim t As String
  t = fso.OpenTextFile(F, ForReading).ReadAll
  
  If Left(t, 3) = UTF8_BOM Then
      fso.OpenTextFile(F, ForWriting).write (Mid(t, 4))
      MsgBox "BOM gelöscht!"
  Else
    MsgBox "UTF-8-BOM nicht erkannt!"
  End If

End Sub

Sub Add_UTF8_Bom()

  Dim fso As New FileSystemObject
  Dim t As String
  t = fso.OpenTextFile(F, ForReading).ReadAll
  
  If Left(t, 3) = UTF8_BOM Then
    MsgBox "UTF-8-BOM bereits vorhanden!"
  Else
      fso.OpenTextFile(F, ForWriting).write UTF8_BOM & t
      MsgBox "BOM hinzugefügt!"
  End If

End Sub

Außerhalb von VBA können Sie die Skripte has-bom.vbs, add-utf8-bom.vbs und delete-utf8-bom.vbs verwenden. Die .vbs-Dateien bspw. auf den Desktop ablegen und dann beliebige Dateien per Drag and Drop untersuchen bzw. manipulieren.