XML hat im Web versagt - Teil 2

Was bisher geschah. Es gibt zig Zeichensätze. Welchen man benutzt, ist erstmal egal, nur muss man dies konsequent tun. XML-Dokumente müssen sagen, in welchem Zeichensatz sie zu lesen sind. HTTP legt auch einen Zeichensatz für Dokumente fest. Verschickt man also XML-Dokumente über HTTP hat man zwei Angaben über den Zeichensatz. Die XML-Spec sagt nun, das man bei doppelten Angaben denen des übergeordneten System trauen soll, in diesem Fall also denen von HTTP. Problematisch dabei: das XML-Dokument enthält deutsche Schriftzeichen, der Webserver steht aber in den USA und sendet alle Dateien mit der Zeichensatzangabe ascii aus - dieser Zeichensatz kennt keine Umlaute, das XML-Dokument ist demnach nicht wohlgeformt, peng.

Um die Verwirring perfekt zu machen, spielt neben der Angabe des Zeichensatzes auch die des Content-types in HTTP eine Rolle. In dem RFC 3023 wird nämlich festgelegt, welcher Zeichensatz bei welchem Content-type anzunehmen ist, wird kein Zeichensatz angegeben. So legt der RFC fest, das Dokumente, die als text/xml verschickt werden, den Zeichensatz us-ascii verpasst bekommen.

Das Problem liegt also im Zusammenspiel von XML und HTTP. HTTP kann Dokumente sinnvollerweise nur an Äußerlichkeiten erkennen, zum Beispiel der Dateiendung, und alle Dateien mit dem gleichen Merkmal gleich behandeln. Die Alternative wäre, bei jeder Anfrage die Angaben über Content-type und Zeichensatz direkt aus dem Dokument herauszulesen - mit dem Ergebnis, das XML-Anwendungen im Web verdammt langsam werden würden.
XML hingegen legt diese Angaben auf Dokument-Ebene fest. Äußerlichkeiten wie Dateiendungen sind XML egal, solange der Inhalt valides XML ist, wird jeder Parser es als solches erkennen und verarbeiten können.

Die Lösung des Problems muss an zwei Stellen erfolgen. Zum einen müssen Webserver korrekt konfiguriert werden, so daß sie verschiedene Typen von XML-Dokumenten mit dem korrekten Content-type ausliefern. Zum anderen müssen XML-Applikationen und Webserver aufeinander abgestimmt werden, damit beide den gleichen Zeichensatz für das selbe Dokument verwenden. Technisch ist das relativ einfach zu lösen, beispielsweise über Weiterleitungen oder dynamische Auslieferung durch Skriptsprachen, die den Content-type/charset-HTTP-Header selbst für jedes ausgelieferte Dokument setzen.

XML hat im Web versagt

Die Kernaussage lautet: 44% einer Stichprobe von n=5096 Feeds von Syndic8 sind nicht wohlgeformt, also ist XML am Ende.

Das zugrundeliegende Problem hat allerdings strenggenommen nichts mit XML zu tun, sondern mit Zeichensätzen und der Art und Weise, wie Daten per HTTP übertragen werden.

XML.com: XML on the Web Has Failed [via cyDome - Fast die Hälfte der RSS-Feeds ist ungültig]

Zeichensätze gibts wie Sand am Meer. Da wären zunächst mal die alten Bekannten ASCII und ANSI, die Veteranen unter den Zeichensätzen. ASCII, aus dem Jahre des Herren 1968, umfasst einen Zeichensatz von 2^7, also 128 Zeichen, kodiert in einem Byte pro Zeichen. Darin enthalten sind 32 nicht sichtbare Steuerzeichen, das lateinische Alphabet in Groß- und Kleinschreibung, die Ziffern von 0-9, nordamerikanische Satzzeichen und ein paar Sonderzeichen, die man zum Programmieren braucht. Keine Äs und ßs, keine spanischen Satzzeichen, keine französischen Anführungsstriche.

Danach kam ANSI, bzw. ISO 8859. Immerhin 256 Zeichen, und damit auch die wichtigsten Sonderzeichen. Allerdings immer noch nur für Sprachen mit lateinischem Alphabet. Hier leistete sich Microsoft eine Extrawurst. Man baute den auch Latin-1 genannten ISO 8859-1 um nannte ihn Windows-ANSI.

Die ISO 8859-Familie besteht aus ca. 16 Zeichensätzen. Wieso ca.? Weil der keltische Zeichensatz zwar geplant (die Nummer wurde sozusagen reserviert) aber nie verabschiedet wurde. Die ISO 8859-Zeichensätze für arabisch, kyrillisch und andere nicht-lateinische Alphabete sind teilweise unzureichend umgesetzt. Zum einen Aufgrund der Beschränkung auf 256 bzw. 224 (32 Steuerzeichen) Zeichen, zum anderen weil es bessere Alternativen gibt.

Auftritt Unicode. Unicode stellt einen Versuch dar, alle Zeichen aller lebenden Sprachen abzubilden. Dazu sieht der Standard pro Alphabet eine Zeichentabelle vor. Die Zeichen selbst sind durchnummeriert von 0 bis 65535. Unicode kennt also 65536 verschiedene Zeichen für eine ganze Reihe von Schriftsätzen, darunter das Runenalphabet, Braille oder graphische Elemente.
Unicode bläht (vier Bytes pro Zeichen, 2^16 = 65536) jeden ASCII-Text um das Vierfache auf. Heutzutage kein so großes Problem mehr, das durch relativ billige Massenspeicher gelöst werden kann.
Nein, Unicode bläht nicht jeden ASCII-Text um das Vierfache auf. Es gibt Varianten, die jedes Zeichen mit nur zwei Byte darstellen, die Textgröße also nur verdoppeln. Und es gibt eine 1-Byte-Variante, da ändert sich nichts an der Größe und sogar eine 7-bitige Variante, die nur die 2^7 ASCII-Zeichen enthält.

Daneben gibt es noch Windows-1252 , MacRoman und bestimmt noch ein paar andere, die ich nicht kenne.

Zurück zur Aussage, XML hätte im Web versagt. XML sieht vor, das für jedes Dokument explizit der Zeichensatz angegeben wird, mit dem es erstellt wurde und zu Lesen ist. Soweit kein Problem, als XML-Entwickler weiß man dies und implementiert es entsprechend.

Wird eine XML-Datei (das könnte im Sinne dieses Textes ein HTML-, ein XHTML- oder ein Feed-Dokument in RSS, RDF oder Atom sein), markiert als mit ISO 8859-1 erstellt, nun über das Web-Protokoll HTTP an einen Browser geschickt, so gibt HTTP der Datei einen HTTP-Header mit. Und in diesem findet man neben neben allen möglichen technischen Daten auch eine Angabe für den verwendeten Zeichensatz. Das Problem dabei: woher weiß HTTP, welche Zeichensatzangabe es in den Header packen soll?
In der Regel geschieht dies durch Konfiguration des Webservers, der die Datei verschickt und dafür sorgt, einen ordnungsgemäßen Header mitzuliefern. Der Server steht in den USA und sendet alle Dokumente mit der Zeichensatzangabe us-ascii aus. Dumm nur, wenn im XML-Dokument aber iso-8859-15 steht, weil zum Beispiel das EURO-Zeichen € vorkommt, das der Zeichensatz US-ASCII nicht kennt.

Welche Angabe also sollte das verarbeitende Programm, hier der Browser, benutzen? Der XML-Standard sagt hierzu deutlich, das die Angabe des übergeordneten Systems zu verwenden ist. XML wird über HTTP übertragen, also wird die Angabe im Dokument ignoriert und der HTTP-Header zur Entscheidung der Zeichensatzfrage herangezogen.

Der sagt us-ascii, dieser Zeichensatz kennt kein EURO-Symbol, das Dokument ist nicht wohlgeformt, peng.

Der Autor geht an dieser Stelle erstmal frühstücken. Bis später.

Schlamperei bei Spiegel TV

To: spon_spiegeltv@spiegel.de
CC: spon_leserbriefe@spiegel.de
Subject: Leserbrief zum Artikel Die Flucht des Phantoms: Der Fall Pfahls und die Geheimnisse der Kohl-Regierung (ID:+308398)

Sehr verehrte Damen und Herren,

betreffend des Beitrags ‘Das Schwert der Scharia’ möchte ich Sie bitten,
in Zukunft Begebenheiten so darzustellen, wie sie tatsächlich sind.

Besonders das Gespräch mit dem Mitarbeites eines Domain-Registrars in
Düsseldorf zeigt durch Fragen wie ‘Aber Sie sehen doch, was auf der
Webseite steht, das kann man doch wissen, Sie aber kassieren nur und
schauen weg’ (sinngemäß und zusammengefasst) deutlich, das die Redaktion
entweder aus Nicht-Verständnis der Technik oder - und das wäre
schlechter, gegen den Pressekodex verstoßender Journalismus -
absichtlich zur Erzeugung eines gesteuerten Meinungsbildes Sündenböcke
schaffen will.

Ein qualifizierter technischer Berater hätte Ihnen bereits im Vorfeld
erklären können, das diese Frage mit dem Domain-Registrar den Falschen trifft.

Ich hoffe abschließend, das dieser Faupax lediglich auf Schlampigkeit
bei den Recherchen und nicht auf willentlicher Manipulation zur
Vergrößerung des medialen Effekts beruht.

Mit freundlichen Grüßen, Sascha Carlin

23-net

Das 23-net ist ein junges deutsches IRC-Netzwerk mit einer sehr elegant gestalteten Website. Über die Website können Mitglieder einen Webmail-Client nutzen, chatten und sich im Forum austauschen.

Das mit phpBB realisierte Forum wirkt sehr aufgeräumt und übersichtlich. Und Haustiere gibts auch ;)