Thomas: Komische Zeichen beim ersten Seitenladen

Hallo,

ich habe Homepage gestaltet und beim ersten Laden vom Server (oder gleich nach dem Löschen des Caches und sofortigem Reload) wird bis zum endgültigen Bildaufbau folgende Zeichenfolge angezeigt:

Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿ Ï»¿

Danach verschwindet sie wieder und taucht auch nicht im Quelltext auf.
Was könnte das sein? Soviel ich ermittelt habe, ist es anscheinend nicht browserabhängig.

Der Server läuft auf Linux.

mfg, Thomas

P.S.: Im Kopf der Datei habe ich folgende DTD, falls es damit zusammenhängen sollte:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

  1. Hallo,

    ich habe Homepage gestaltet

    mit PHP oder etwas ähnlichem und einer Serie von Includes?

    und beim ersten Laden vom Server (oder gleich nach dem Löschen des Caches und sofortigem Reload) wird bis zum endgültigen Bildaufbau folgende Zeichenfolge angezeigt:

    Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿Ï»¿ Ï»¿

    Danach verschwindet sie wieder und taucht auch nicht im Quelltext auf.

    das dürfte ein Irrtum sein.

    Was könnte das sein?

    Eine ganz Serie von BOMs

    Soviel ich ermittelt habe, ist es anscheinend nicht browserabhängig.

    Nein, da war ein Editor dran schuld.

    Der Server läuft auf Linux.

    Unter Windows wäre das Ergebnis nicht anders :-)

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      mit PHP oder etwas ähnlichem und einer Serie von Includes?

      Genau.

      Danach verschwindet sie wieder und taucht auch nicht im Quelltext auf.
      das dürfte ein Irrtum sein.

      Jedenfalls nicht SICHTBAR :-)

      Eine ganz Serie von BOMs

      Und wie bekomme ich die raus?

      Nein, da war ein Editor dran schuld.

      Ich benutze BBEdit auf dem Mac.

      mfg, Thomas

      1. bzw. mich welchem Editor auf dem PC kann ich das Problem bekämpfen?

        Braucht eine UTF-8 Datei überhaupt ein BOM?

        Ich includiere nämlich in eine PHP Datei Text nebst Deutsch auch in osteuropäischen Sprachen, sowie in mehr exotischeren wie Arabisch, Chinesisch, Hindi etc.

        Danke für jeden Tipp!

        Thomas

        1. Hallo

          bzw. mich welchem Editor auf dem PC kann ich das Problem bekämpfen?
          Braucht eine UTF-8 Datei überhaupt ein BOM?

          nein, eine BOM ist allerdings erlaubt.
          Vermutlich kannst Du Deinen Editor so konfigurieren, dass er die Dateien ohne BOM abspeichert. Befrage die Hilfe Deines Editors.

          notepad++, vim und viele andere mehr können das.

          Freundliche Grüße

          Vinzenz

          1. hallo,

            ich habe mir Notepad++ installiert, sehe aber im Quellcode kein BOM, aber im Menü, dass die Datei UTF-8 kodiert ist.

            Soll ich hier einfach auf "UTF-8 ohne BOM" umstellen und neu speichern?
            Klappt das auch, wenn ich, wie du sagst, mehrere BOMs drin habe in der Datei?

            Wie kamen die überhaupt da rein?

            lg, Thomas

            P.S.: Bitte entschuldige die lästige Fragerei, ist ganz neue Materie für mich und du bist der Erste, der mir da etwas Licht bringen kann :D

            1. Hallo Thomas,

              Klappt das auch, wenn ich, wie du sagst, mehrere BOMs drin habe in der Datei?
              Wie kamen die überhaupt da rein?

              Vinzenz hat nicht gesagt (und sicher auch nicht gemeint), dass du mehrere BOMs in einer Datei hast.
              Aber wahrscheinlich je eine in jeder einzelnen Quelldatei. Und da auch bei PHP-Includes jede Datei wieder mit "[BOM]<?php" anfängt, summieren sich die BOMs im resultierenden Dokument, das zum Client übertragen wird.

              P.S.: Bitte entschuldige die lästige Fragerei, ist ganz neue Materie für mich und du bist der Erste, der mir da etwas Licht bringen kann :D

              Die Fragerei ist keineswegs lästig - solange du versuchst, die Antworten zu verstehen. ;-)

              Schönen Abend noch,
               Martin

              --
              Wer im Glashaus sitzt, sollte sich nur im Dunkeln ausziehen.
              1. Besten Dank an meine beiden Helfer! ;-)

                mfg, Thomas

                1. Noch zwei Fragen:

                  1. in meinem anderen Editor habe ich zur Auswahl, die Datei mit folgenden Line-Breaks zu speichern:
                  Macintosch
                  Unix
                  DOS
                  Unicode

                  Ist es egal, welches ich nehme bzw. was bewirken die verschiedenen Einstellungen?

                  2. Zum Includieren:
                  Müssen die aufrufende Datei und die Includes die gleiche Kodierung aufweisen?

                  mfg, Thomas

                  1. Hab noch eine, hab noch eine :-)

                    Meine Neugierde ist geweckt und möchte mich nun in Unicode einschleichen...

                    Wie kann ich z.B. das BOM und andere Unicode-spezifische Strukturen sehen (und theoretisch) ändern? Gibt es dazu spezielle Tools?

                    mfg, Thomas

                    1. echo $begrüßung;

                      Wie kann ich z.B. das BOM und andere Unicode-spezifische Strukturen sehen (und theoretisch) ändern? Gibt es dazu spezielle Tools?

                      Mir ist kein Texteditor bekannt, der die BOM als Zeichen darstellt, denn eigentlich ist sie ja als Steuerzeichen unsichtbar. Du kannst dir die Bytes per Hexeditor anschauen oder den Text mit einer falschen Kodierung einlesen, die die Bytes dieser Zeichen als einzelne Zeichen ohne besondere Bedeutung betrachtet. (z.B. ISO-8859-1, in der hast du sie ja schon im Browsr gesehen.)

                      echo "$verabschiedung $name";

                    2. Hallo Thomas,

                      Hab noch eine, hab noch eine :-)

                      *grins*

                      Wie kann ich z.B. das BOM und andere Unicode-spezifische Strukturen sehen (und theoretisch) ändern? Gibt es dazu spezielle Tools?

                      am einfachsten mit einem Editor, der Unicode nicht unterstützt (also wohl vorwiegend Programme, die deutlich älter als 5 Jahre sind). Die zeigen die UTF8-codierten Zeichen dann als Zeichensalat an, eine BOM etwa als Sequenz von drei Bytes, wie du sie in deinem Anfangsposting auch dargestellt hast (), die deutschen Umlaute jeweils als Pärchen (ä,ö,ü).
                      Oder natürlich mit einem Hex-Editor, dann siehst du auch gleich die Byte-Werte dazu.

                      So long,
                       Martin

                      --
                      Lebensmotto der Egoisten:
                      Was ist so schlimm daran, dass jeder nur an sich selbst denkt? Dann ist doch an alle gedacht!
                  2. echo $begrüßung;

                    1. in meinem anderen Editor habe ich zur Auswahl, die Datei mit folgenden Line-Breaks zu speichern:
                      Macintosch
                      Unix
                      DOS
                      Unicode
                      Ist es egal, welches ich nehme bzw. was bewirken die verschiedenen Einstellungen?

                    Darf ich dich da auf die Wikipedia verweisen, die erklärt den Zeilenumbruch ausführlicher als ich das eben machen wollte. Die Variante Unicode ist mir noch nicht übern Weg gelaufen. Meiner persönlichen Meinung nach scheint das keine große Verbtreitung haben. Sie ist auch nur auf der englischsprachigen Seite LineFeed zu finden.

                    1. Zum Includieren:
                      Müssen die aufrufende Datei und die Includes die gleiche Kodierung aufweisen?

                    Zum einen sind inkludierte Dateien so zu betrachten, als ob ihr Inhalt an der inkludierenden Stelle stünde. Zum anderen hat PHP derzeit noch keine direkte Unterstützung von Mehrbyte-Kodierungen. Es geht von "1 Byte = 1 Zeichen" aus. Da es weder seine Textstrings noch den HTML-Teil weiter beachtet, ist es an dir, für die richtige Kodierung zu sorgen. Es ist auch technisch unmöglich, eine Zeichenkodierung einwandfrei zu erkennen. Als Mensch sieht man aus dem Zusammenhang, dass ein bestimmter Krakel eigentlich ein U statt ein X darstellen soll, doch der Rechner ist noch nicht so intelligent. Die HTML-Teile werden von PHP einfach nur durchgereicht. Wenn du da eine unterschiedliche Kodierung hast, wird die 1:1 in das fertige Dokument übernommen, was zu Zeichensalat führt, da die Kodierung nur dokumentweit angegeben werden kann. Strings könntest du zumindest mit den Umkodierfunktionen bearbeiten. Doch das geht nur solange gut, solange alle Zeichen in der Zielkodierung darstellbar sind. Umkodierfunktionen sind in der iconv-Extension enthalten, und weniger mächtig auch in recode. Beides sind optionale Bestandteile PHPs. In den XML-Parser-Funktionen sind außerdem noch utf8_decode() und utf8_encode() enthalten, die aber nur die unteren 256 Zeichen aus dem Unicode-Vorrat zwischen UTF-8 und ISO-8859-1 umwandeln können.

                    echo "$verabschiedung $name";

            2. Hallo Thomas,

              ich habe mir Notepad++ installiert, sehe aber im Quellcode kein BOM, aber im Menü, dass die Datei UTF-8 kodiert ist.

              das ist ja auch richtig. Wenn Du eine Datei mit BOM editierst, dann willst Du
              nur den Inhalt editieren, nicht jedoch (versehentlich) die Byte Order Mark verändern, dafür ...

              Soll ich hier einfach auf "UTF-8 ohne BOM" umstellen und neu speichern?

              Ja. Mache einen einfachen Test:

              Erstelle eine neue Datei: test.txt
              Als Inhalt gebe einfach nur das Wort "Test" ein, ohne Zeilenende.
              Speichere in notepad++ als UTF-8, Du wirst feststellen, dass die Datei 7 Byte
              groß ist. Neben den vier Byte für das Wörtchen Test werden die drei Byte für
              die BOM benötigt.
              Speichere nun als "UTF-8 ohne BOM", die Dateigröße verringert sich auf vier
              Byte, weil die BOM entfernt wird.

              Klappt das auch, wenn ich, wie du sagst, mehrere BOMs drin habe in der Datei?
              Wie kamen die überhaupt da rein?

              Wie Martin schon anmerkte, meinte ich nicht, Du hättest in einer Datei mehrere
              BOMs. Die diversen Includes bringen ihre BOM auch mit :-)

              P.S.: Bitte entschuldige die lästige Fragerei, ist ganz neue Materie für mich und du bist der Erste, der mir da etwas Licht bringen kann :D

              Ich find's auch nicht lästig. Du fragst interessiert, Du willst etwas lernen, Du gibst Rückmeldung - das ist das, was Leute die hier öfter auftauchen (so wie ich), zu schätzen wissen.

              BOMs werden (bei Verwendung von derzeitigem PHP) spätestens dann lästig, wenn Du eigene Header verschicken willst, z.B. eine Weiterleitung - und Du die allseits beliebte Fehlermeldung erhältst, dass das nicht mehr ginge "header already sent in Line xyz ...", obwohl Du ganz bewußt noch keine Ausgabe vorgenommen hast. Naja, eine oder mehrere BOMs wurden bereits ausgegeben - also sah sich PHP in der Pflicht, die üblichen Standardheader zu verschicken und Dir eine Fehlermeldung aufzutischen ...

              Freundliche Grüße

              Vinzenz

  2. Beim Umstellen von UTF-8 mit BOM auf UTF-8 ohne BOM und anschliessendem Abspeichern wurden einige diakritische Zeichen, auch die deutschen Umlaute in solche Zeichenpaare umkodiert.

    Wäre nicht weiter schlimm, aber im Browser werden nicht alle Substitute korrekt angezeit, sonder als Buchstabensalat.

    Habe dass jetzt zwar per S&R behoben, aber warum passierte das, ich habe ja nur die BOM rausgenommen?

    mfg, Thomas

    1. echo $begrüßung;

      Beim Umstellen von UTF-8 mit BOM auf UTF-8 ohne BOM und anschliessendem Abspeichern wurden einige diakritische Zeichen, auch die deutschen Umlaute in solche Zeichenpaare umkodiert.
      Wäre nicht weiter schlimm, aber im Browser werden nicht alle Substitute korrekt angezeit, sonder als Buchstabensalat.
      Habe dass jetzt zwar per S&R behoben, aber warum passierte das, ich habe ja nur die BOM rausgenommen?

      Da spielte wohl auch noch eine andere Kodierung eine Rolle. Bist du sicher, dass der Text beim ersten Einlesen gemäß UTF-8 dekodiert wurde? Davon kann man mit ausreichender Wahrscheinlichkeit ausgehen, wenn der Editor die BOM erkannt hat und entsprechend handelte. Bist du auch sicher, dass der Text nun immer noch als UTF-8 erkannt wird? Nach Entfernen der BOM fehlt nun einer verarbeitenden Stelle das Indiz auf UTF-8-kodierten Text. Vielleicht hat der Editor daraufhin gedacht, nun kommt ISO-8859-1 (oder was Kompatibles, was wohl der Defaulteinstellung des Systems entspricht) angelaufen und sich so verhalten. Wie ich ja schon sagte, gibt es keine funktionierende Methode, die Kodierung einer Datei anhand ihres Inhalts zweifelsfrei zu erkennen. Deswegen fügt man ja in HTML-Dateien und/oder im HTTP-Header eine charset-Angabe ein, damit der Browser weiß, was er da bekommt.

      Am besten arbeitet es sich mit einem Editor oder auch einer IDE, der/die sich für ein Projekt generell auf eine bestimmte Zeichenkodierung voreinstellen lässt. Alle Dateien sollten dann daraufhin beim Öffnen gemäß dieser Kodierung interpretiert werden und beim Speichern entsprechend behandelt werden (falls nicht noch dateiindividuelle Einstellungen getroffen wurden).

      echo "$verabschiedung $name";