Cannot modify header information – headers already sent by

Mit der Funktion header kann man in PHP den HTTP-Header eines Dokuments ändern. Das ist besonders sinnvoll, wenn man dem Browser Bilder ausliefern möchte und daher vermeiden will, dass der Browser das Bild als HTML-Seite interpretiert.

Beim Umgang mit header muss man darauf achten, dass vor dem Einsatz dieser Funktion keine HTML-Tags oder andere formatierte Ausgaben stattfinden. Außerdem dürfen sich vor (und nach!) der PHP-Einbindung keine Leerzeichen befinden.

Ein einfaches header-Beispiel ist:

<?php header("Content-type: image/jpeg") ?>

Selbst bei diesem Einzeiler kann es aber vorkommen, dass eine Warnung mit dem Text „Cannot modify header information – headers already sent by“ ausgegeben wird. In diesem Fall ist die PHP-Datei in UTF-8-Codierung abgepeichert und enthält ein „Byte Order Mark“ (kurz: BOM). Das BOM-Steuerzeichen wird von PHP falsch erkannt, weshalb man für diese Datei „UTF-8 ohne BOM“ als Kodierung wählen muss.

Wie das geht, zeigt dieser Screenshot von Notepad++:

Uncompilable source code

Vorhin wollte ich in NetBeans ein älteres Eclipse-Projekt von mir importieren. Bei der Ausführung des Programms habe ich folgenden Fehler bekommen: Exception in thread „AWT-EventQueue-0“ java.lang.RuntimeException: Uncompilable source code. Obwohl der Source-Code keine syntaktischen Fehler hatte und mir alles „grün“ in NetBeans angezeigt wurde, liess sich das Projekt nicht starten. Nach etwa ausprobieren habe ich festgestellt, dass der Fehler im Zeichensatz der Source-Code Dateien liegt. Die *.java-Dateien wurden in ANSI-Codierung abgespeichert. In den Kommentaren des Quellcodes habe ich aber Deutsche Umlaute verwendet, weshalb sich der Code nicht fehlerfrei ausführen lies.

Alles was ich tun musste war also, die Zeichensatz-Kodierung von ANSI auf UTF-8 umzustellen. Dadurch werden aber die Umlaute „zerstört“ und durch „kleine Vierecke“ ersetzt. Die Moral aus der Geschicht‘: Verwende Umlaute lieber nicht! (…oder nur mir Escape-Sequenzen).

Mit kXML UTF-8 Dateien lesen

Um UTF-8 Zeichensätze korrekt einlesen zu können, muss man (bei Verwendung der kXML-Bibliothek) den Parser auf UTF-8 einstellen:

1
2
3
4
FileConnection fc = (FileConnection) Connector.open(file:///root1/test.xml);
InputStream is = fc.openDataInputStream();
InputStreamReader reader = new InputStreamReader(is, "UTF-8");
XmlParser parser = new XmlParser(reader);

Zur Sicherheit sollten die XML-Dateien immer mit der Kodierung „UTF-8 ohne BOM“ (einstellbar in Notepad++) abgespeichert werden.

Umlaute und Sonderzeichen in Java

Wer schon mal in Java Programme mit Textausgabe programmiert hat, wird feststellen, dass es trotz der Betriebssystemunabhängigkeit von Java Probleme mit der Darstellung von Sonderzeichen auf verschiedenen Betriebssystemen gibt. Daher sollte man Umlaute und Sonderzeichen immer durch Unicode-Escapes im Quellcode ersetzten. Java arbeitet mit 16-Bit Unicodes (UTF-16).

Beispiel:

System.out.println(„\u00C4sthetisches Fr\u00FChst\u00FCcksfernsehen.“);

Übersicht der wichtigsten Unicode-Maskierungen für Java:

Unicode-Escapes Sonderzeichen
\u00A1 ¡
\u00A2 ¢
\u00A3 £
\u00A4 ¤
\u00A5 ¥
\u00A6 ¦
\u00A7 §
\u00A8 ¨
\u00A9 ©
\u00AA ª
\u00AB «
\u00AC ¬
\u00AD ­
\u00AE ®
\u00AF ¯
\u00B0 °
\u00B1 ±
\u00B2 ²
\u00B3 ³
\u00B4 ´
\u00B5 µ
\u00B6
\u00B7 ·
\u00B8 ¸
\u00B9 ¹
\u00BA º
\u00BB »
\u00BC ¼
\u00BD ½
\u00BE ¾
\u00BF ¿
\u00C0 À
\u00C1 Á
\u00C2 Â
\u00C3 Ã
\u00C4 Ä
\u00C5 Å
\u00C6 Æ
\u00C7 Ç
\u00C8 È
\u00C9 É
\u00CA Ê
\u00CB Ë
\u00CC Ì
\u00CD Í
\u00CE Î
\u00CF Ï
\u00D0 Ð
\u00D1 Ñ
\u00D2 Ò
\u00D3 Ó
\u00D4 Ô
\u00D5 Õ
\u00D6 Ö
\u00D7 ×
\u00D8 Ø
\u00D9 Ù
\u00DA Ú
\u00DB Û
\u00DC Ü
\u00DD Ý
\u00DE Þ
\u00DF ß
\u00E0 à
\u00E1 á
\u00E2 â
\u00E3 ã
\u00E4 ä
\u00E5 å
\u00E6 æ
\u00E7 ç
\u00E8 è
\u00E9 é
\u00EA ê
\u00EB ë
\u00EC ì
\u00ED í
\u00EE î
\u00EF ï
\u00F0 ð
\u00F1 ñ
\u00F2 ò
\u00F3 ó
\u00F4 ô
\u00F5 õ
\u00F6 ö
\u00F7 ÷
\u00F8 ø
\u00F9 ù
\u00FA ú
\u00FB û
\u00FC ü
\u00FD ý
\u00FE þ
\u00FF ÿ

Hinweis: Die Unicodes können unter Windows XP auch mit der Zeichentabelle (zu erreichen über Start -> Ausführen -> charmap) gefunden werden.