Follow us on Twitter

Fama nihil est celerius.

Nichts ist schneller als ein Gerücht.

Livius, Ab urbe condita 24,12,5

Windows ist böse

Ok, auch wenn die meisten Linux-Fans bedingungslos zustimmen werden, geht es hier nicht gegen das ganze Windows, sondern den Windows Editor, das Notepad. Der hat in Verbindung mit Joomla eine gemeine und hinterhältige Eigenschaft: Er setzt ungefragt und ungebeten ein BOM bei UTF-8-codierten Texten.

Um zu verstehen, was da passiert, muß man ein wenig hinter die Kulissen blicken. Das Unicode Transformation Format macht endlich Schluß mit dem Wildwuchs bei den Zeichensätzen. UTF-8 ist das verbreitetste UTF-Format und wird sich wohl in Zukunft für die meisten Texte durchsetzen. UTF-16 und UTF-32 gehen verschwenderischer mit dem Speicherplatz um, denn sie benötigen für jedes Zeichen 2 oder 4 Bytes.

Schon seit der Computersteinzeit waren sich die verschiedenen Systeme nie einig, ob bei der Zusammenfassung mehrerer Bytes das höchstwertige Byte vorn oder hinten ist. Will man also solche mehrbytigen Werte auf verschiedenen Systemen nutzen, muß man angeben, wo das höchstwertige Byte steht. Das wird bei UTF-codierten Dateien mit dem so genannten Byte Order Mark (BOM) am Anfang der Datei gemacht. Da dieses BOM rein informativen Charakter für den Editor selbst hat, wird es nicht angezeigt. Man sieht es nur, wenn man die Datei mit einem Hex-Editor betrachtet. Wenn man so eine Datei allerdings in einer ISO-codierten Webseite ausgibt, sieht man das BOM als sinnlose Zeichenfolge .

Bei den 2- und 4-bytigen Codierungen UTF-16 und UTF-32 ist dieses BOM unbedingt erforderlich. Bei UTF-8 werden die Zeichen aber nur mit einem Byte dargestellt, und dabei gibt es logischerweise keine Byte-Reihenfolge. Das BOM ist zwar zulässig, aber völlig sinnlos.

Und was das Ganze mit Joomla zu tun? Dazu muß man wissen, wie ein Webserver die Dateien an den Browser ausliefert. Diese Daten bestehen nicht allein aus den sichtbaren Daten (HTML-Code, CSS, Bilder), sondern ihnen voraus wird ein Dateiheader geschickt, in dem steht, was der Browser an Daten erwarten muß. Normalerweise stellt der Server selbst fest, um welche Art Daten es sich handelt und schickt den Header automatisch ab. Der Webmaster muß nichts dazu tun.

Anders sieht es aber aus, wenn mit dem Header bestimmte Aufgaben erfüllt werden sollen, die der Server nicht automatisch erledigt, z.B. das Starten einer Session, um den Benutzer während seines Besuchs wiederzuerkennen. Dann muß der Webmaster den dafür nötigen Teil des Headers selbst zusammenstellen und abschicken, bevor die ersten Daten zum Browser geschickt werden. Wenn auch nur ein Zeichen geschickt wird, stellt der Server den Header zusammen und schickt ihn ab. Für einen eigenen Header ist es dann zu spät.

Bei PHP wird alles außerhalb von <?php ...  ?> als normale Zeichen ausgegeben. Und da das BOM das allererste Zeichen so einer Datei ist, kommt es auf jeden Fall vor dem öffnenden <?php. Auch wenn die Datei gar keine Ausgabe machen soll wie z.B. die configuration.php bei Joomla, wird das BOM zum Browser geschickt und vorher natürlich der Header. Wenn Joomla kurz darauf seinen eigenen Header abschicken will, um eine Session für einen registrierten User oder einen Admin zu starten, meckert der Server:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/x/www/htdocs/configuration.php:1) in ...

In den erwünschten Joomla-Einstellungen sieht man diese Meldung allerdings nicht, weil die Fehlermeldungen unterdrückt werden. Man merkt es aber daran, daß der registrierte User nicht an die Inhalte für registrierte kommt und der Admin nicht ins Backend.

So hat eine winzige, unsichtbare Ursache absolut nervige Folgen. Und deshalb ist der Windows-Editor böse.

All diese Probleme kann man vermeiden, indem man für das Bearbeiten von Joomla-Dateien einen Editor benutzt, der nicht einfach ungefragt unerwünschte Zeichen einfügt, z.B. das kostenlose Notepad++ oder eine der vielen Alternativen.

Um den Fehler mit Notepad++ zu reparieren, öffnet man die Datei, die in der Fehlermeldung bei "(output started at /home/x/www/htdocs/configuration.php:1)" genannt wird, wählt im Menü Kodierung -> Konvertiere zu UTF-8 ohne BOM und speichert die Datei wieder. Da das BOM im Editor nicht angezeigt wird, sieht man keinen Unterschied.

Wichtig: Auch ohne BOM darf sich vor dem öffnenden <?php kein Zeichen befinden, weder ein Leerzeichen noch ein Zeilenumbruch. Das < muß das erste Zeichen der Datei sein.

Wer ganz sicher gehen will, öffnet die Datei gar nicht mit einem Texteditor, sondern gleich mit einem Hex-Editor wie HxD. Im Hex-Modus sind die drei Bytes des BOM auf jeden Fall sichtbar. Um es zu entfernen, müssen die drei Bytes EF BB BF am Anfang gelöscht werden. Die Warnung, daß dadurch die Dateilänge verändert wird, muß bestätigt werden. Genau das ist gewollt. Danach muß das erste Zeichen der Datei 3C (<) sein. Sollten vor dem 3C noch weitere Zeichen sein, müssen auch sie gelöscht werden.


Dieses Gerücht stimmt:

( 100% 14 Stimmen )

Kommentare  

 
+1 # Text!der.Ede 2010-08-04 20:14
Sehr netter Text Dietmar, schön zu lesen und sicherlich für viele Windoof Joomla Nutzer zu empfehlen!

MfG
Antworten | Antworten mit Zitat | Zitieren
 
 
+1 # RE: Windows ist böseJimbo 2010-08-05 18:56
Gewusst DASS es so ist und jetzt auch warum. Danke für die Erklärung Dietmar.
Antworten | Antworten mit Zitat | Zitieren
 

Kommentar schreiben


Copyright © 2010 Joomla-Gerüchte - developed & designed by Templateworks