Henry: UTF-8 abgespeichert aber Ansi erkannt

Hallo,

manchmal bringen einem die einfachsten Sachen zur Verzweiflung und bei der Lösung entstehen neue Fragen…

Ich versuche immer schön alles in UTF-8 abzuspeichern um Konflikte zu vermeiden. Nun musste ich aber feststellen, dass darauf nicht unbedingt Verlass ist. Wann immer ich eine bestimmte Datei so abgespeichert habe, wars beim Öffnen wieder Ansi. Dachte schon Editor defekt, Schreibschutz, etc. Nach ewig langem Suchen im Netz die Lösung gefunden. Einfach ein paar typische Sonderzeichen , wie Umlaute reinschreiben, so dass UTF-8 auch interpretiert werden muss. Ok,... aber das bringt mich dann auch wieder zum Nachdenken.

Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

Bzw. was passiert(fällt mir gerade ein) wenn sich diese als Ansi deklarierte(geht ja nicht anders) Datei später, scriptgesteuert oder Editor, ändert? Moment dass muss ich gerade mal testen, lass den Gedankengang aber trotzdem hier stehen...

Ok, getestet, es bleibt Ansi. Da ist doch ein Damoklesschwert, wenn man das nicht im Hinterkopf behält?

Gruss
Henry

Folgende Nachrichten verweisen auf diesen Beitrag:

  1. Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

    Weil es nicht möglich ist, anhand einer vorliegenden Bytesequenz (Datei) festzustellen, welche Zeichenkodierung damit jemand beabsichtigt.

    MfG

  2. Hallo Henry,

    Wann immer ich eine bestimmte Datei so abgespeichert habe, wars beim Öffnen wieder Ansi. Dachte schon Editor defekt, Schreibschutz, etc. Nach ewig langem Suchen im Netz die Lösung gefunden. Einfach ein paar typische Sonderzeichen , wie Umlaute reinschreiben, so dass UTF-8 auch interpretiert werden muss.

    Umlaute sind keine Sonderzeichen. 😉

    Wenn das wirklich so ist, wie du beschreibst, solltest du dringend den Editor wechseln.

    Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

    Weil eine Flasche auch nicht weiß, welcher Inhalt in sie gefüllt werden wird.

    Bis demnächst
    Matthias

    -- Rosen sind rot.
    1. Hello,

      Wenn das wirklich so ist, wie du beschreibst, solltest du dringend den Editor wechseln.

      Ich würde erxtmal damit beginnen, ihn passend einzustellen. :-)

      Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

      Weil eine Flasche auch nicht weiß, welcher Inhalt in sie gefüllt werden wird.

      Das Beispiel mit der Flasche ist ganz nett. Es gibt nämlich bestimmte Flaschen(formen), bei denen man auch ohne Etikett zumindest annehmen darf, was wohl drin ist. Das ist zwar auch nicht 100%ig verlässlich, aber zumindest ein Ansatz. Übertragen auf Dateien könnte man da im Nachfolgezeitalter von 8+3-Dateinamen oft durchaus eine Kennzeichnung für die Kodierung in den Dateinamen mit aufnehmen. An manchen Stellen mag es das System out of the Box aber nicht (Bsp.: index.php != index.utf8.php).

      Und innerhalb von Dateien gibt es weitere Möglichkeiten. Die BOM soll ja inzwischen sogar bei PHP keine Probleme mehr machen (?) und/aber wenn man in die erste Zeile von Textdateien eine passende (auskommentierte) Markierung aufnimmt (Bsp.: ### uft-8 ### ÄÖÜäöü ### ) erkennen viele Editoren dies und schalten ihre Kodierung passend um. Zumindest sieht man sofort, wenn anstelle von UTF-8 eine ISO1252-x oder ISO8859-x verwendet wird.

      Problematisch wird es ja meistens auch erst, wenn man die Datei mal so und mal anders kodiert abspeichert. Dann hat man sich im hinteren Teil (der aus dem Blickfeld geraten ist) oft nette Überraschungen gebastelt.

      Liebe Grüße
      Tom S.

      -- Es gibt nichts Gutes, außer man tut es
      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  3. Tach!

    Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

    Dateien haben keine externen Metadaten, in denen solche Informationen wie die Zeichenkodierung hätten eingefügt sein können. Textdateien haben auch keinen Datenblock intern, um Metadaten angeben zu können. So etwas hat man nicht erfunden und deshalb gibt es keine systemübergreifende Möglichkeit für nicht zum Inhalt gehörende Daten. Selbst ein Dateiname benötigt eine Sonderbehandlung innerhalb eines Systems oder ein entsprechend standardisiertes Protokoll, wenn er für den Datenaustausch notwendig ist.

    Und so existieren lediglich ein paar Insellösungen, um eine Zeichenkodierung anzugeben. In HTML gibts ein Meta-Element, das ziemlich am Anfang notiert werden muss, und auch nur deshalb richtig gelesen werden kann, weil man annimmt, dass eine zu ASCII kompatible Kodierung verwendet wird.

    Für Textdateien allgemein kann man die optionale BOM (Byte-Order-Markierung) verwenden. Eine solche ist vorgeschrieben weil zweingend notwendig bei UTF-16/32 und optional bei UTF-8, weil sie da nicht gebraucht wird. Aber man kann sie dazu verwenden, UTF-8 zu erkennen.

    Abspeichern mit BOM kann dein Problem lösen. Aber es kann auch zu anderen Problemen führen, wenn das empfangende/lesende System keine BOM erwartet.

    Bzw. was passiert(fällt mir gerade ein) wenn sich diese als Ansi deklarierte(geht ja nicht anders) Datei später, scriptgesteuert oder Editor, ändert? Moment dass muss ich gerade mal testen, lass den Gedankengang aber trotzdem hier stehen...

    Wenn der Empfänger keine Angabe zur Kodierung bekommt, kann er nur raten und aus Indizien schließen, was dann auch zu Fehlschlüssen und daraus folgenden Fehler führen kann.

    Ok, getestet, es bleibt Ansi. Da ist doch ein Damoklesschwert, wenn man das nicht im Hinterkopf behält?

    Stell deine Editor so ein, dass er per Default UTF-8 speichert.

    Das löst dein Problem mit dem Erkennen von ANSI aber nicht, weil es dafür keine Lösung gibt, abgesehen von der BOM. Text, der keine Zeichen oberhalb von U+007F verwendet, ist ASCII-kompatibel, und es ist deshalb kein Fehler, wenn der Editor das nicht als UTF-8 erkennt. Es endet dann aber mit ungewollter Kodierung, wenn er hinzukommende Zeichen oberhalb U+007F als ISO-8859-irgendwas/ANSI speichert.

    P.S. ASCII ist kein Synonym zu ANSI. ASCII sind die Zeichen von U+0000 bis U+007F kodiert als ein Byte. ANSI ist ein Synonym, das für alle Kodierungen der ISO-8859-Familie und Windows-8-Bit-Kodierungen steht.

    UTF-8 kann man anhand der spezifischen und relativ (nicht absolut) eindeutigen Bytefolgen erkennen (wenn denn Zeichen oberhalb von U+007F drin vorkommen). Ein-Byte-Kodierungen hingegen kann man nicht erkennen ohne eine Plausibilitätsprüfung des Inhalts, wozu man Mensch sein muss oder anderweitig Verständnis für Sprachen und deren Rechtschreibung haben muss.

    dedlfix.

    1. @@dedlfix

      Abspeichern mit BOM kann dein Problem lösen. Aber es kann auch zu anderen Problemen führen, wenn das empfangende/lesende System keine BOM erwartet.

      Sind noch Browser im Umlauf, die mit einem BOM am Anfang Probleme haben?

      Ein BOM in einer Datei ist aber problematisch, wenn eine Ressource aus Dateien zusammengebaut wird und dann ein Zeichen U+FEFF mittendrin auftaucht.

      LLAP 🖖

      -- “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      1. Tach!

        Abspeichern mit BOM kann dein Problem lösen. Aber es kann auch zu anderen Problemen führen, wenn das empfangende/lesende System keine BOM erwartet.

        Sind noch Browser im Umlauf, die mit einem BOM am Anfang Probleme haben?

        Ich dachte da allgemein, ohne mich konkret festzulegen, und nicht beschränkt auf das Web.

        dedlfix.

        1. @@dedlfix

          Abspeichern mit BOM kann dein Problem lösen. Aber es kann auch zu anderen Problemen führen, wenn das empfangende/lesende System keine BOM erwartet.

          Sind noch Browser im Umlauf, die mit einem BOM am Anfang Probleme haben?

          Ich dachte da allgemein, ohne mich konkret festzulegen, und nicht beschränkt auf das Web.

          Auch allgemein kann man Systeme, die vorgeben, UTF-8 zu verarbeiten, aber bei einem BOM aussteigen, als kaputt bezeichnen.

          LLAP 🖖

          -- “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    2. Hallo,

      Warum weiß ein Editor nicht im Vorfeld wie eine Datei formatiert ist?

      Dateien haben keine externen Metadaten, in denen solche Informationen wie die Zeichenkodierung hätten eingefügt sein können. Textdateien haben auch keinen Datenblock intern, um Metadaten angeben zu können.

      Ja an so was hatte ich gedacht, aber wenn ich das jetzt richtig verstanden habe, dann hätte alles was man am Binärcode einer textbasierten Datei ändert, eine Auswirkung auf deren Inhalt. Keine seperaten Anweisungen zur Identifizierung möglich. Hört sich für mich nach Überraschungseier an ;-) und hätte ich jetzt nicht so erwartet. Dachte eher jede Datei hätte versteckte Infos, die keine Auswirkung auf den Inhalt haben.

      Und so existieren lediglich ein paar Insellösungen, um eine Zeichenkodierung anzugeben. In HTML gibts ein Meta-Element, das ziemlich am Anfang notiert werden muss, und auch nur deshalb richtig gelesen werden kann, weil man annimmt, dass eine zu ASCII kompatible Kodierung verwendet wird.

      Was natürlich nichts bringt, wenn ich in bei einer Ansi-Datei UTF8 im <Meta> angebe.

      Abspeichern mit BOM kann dein Problem lösen. Aber es kann auch zu anderen Problemen führen, wenn das empfangende/lesende System keine BOM erwartet.

      Genau, da hatte ich schon vor Jahren schlechte Erfahrungen mit einfachen Textdateien, die im Windowseditor immer dieses BOM bekommen. Weiß nicht mehr genau was das Problem war, aber irgendwas mit mehrsprachlichen Texten innerhalb MySql.

      Stell deine Editor so ein, dass er per Default UTF-8 speichert.

      Das tut er, bzw. alle die ich getestet habe. Nur eben beim öffnen zeigen die wieder Ansi an, darum geht's ja.

      ...deshalb kein Fehler, wenn der Editor das nicht als UTF-8 erkennt. Es endet dann aber mit ungewollter Kodierung, wenn er hinzukommende Zeichen oberhalb U+007F als ISO-8859-irgendwas/ANSI speichert.

      Genau.

      Erst mal vielen Dank für die Antworten hier. Offensichtlich hilft da wirklich nur ansifremde Zeichen einzufügen, mach ich jetzt bei jeder HTML/PHP/JS/CSS Datei. Da kann ich es ja schön auskommentieren, problematischer wird's bei einfachen Textdateien, wo ich nichts auskommentieren kann/darf. Aber gut, kein Weltuntergang, einfach im Hinterkopf behalten.

      Gruss
      Henry

      1. Tach!

        Ja an so was hatte ich gedacht, aber wenn ich das jetzt richtig verstanden habe, dann hätte alles was man am Binärcode einer textbasierten Datei ändert, eine Auswirkung auf deren Inhalt.

        Keinerlei Dateien haben irgendeinen Schutz, gegen Änderungen ihres Inhalts. Solange dir nicht das Betriebssystem den Zugriff verwehrt, kannst du mit ihnen machen, was du willst.

        Keine seperaten Anweisungen zur Identifizierung möglich. Hört sich für mich nach Überraschungseier an ;-) und hätte ich jetzt nicht so erwartet. Dachte eher jede Datei hätte versteckte Infos, die keine Auswirkung auf den Inhalt haben.

        Da es keine Garantie für einen bestimmten Inhalt geben kann, ist es im Prinzip immer Glückssache, was der lesende Prozess erkennt. Man hat da nur die Hoffnung, dass kein Mensch oder Prozess oder Hardware-Bug die Daten ändert.

        Und so existieren lediglich ein paar Insellösungen, um eine Zeichenkodierung anzugeben. In HTML gibts ein Meta-Element, das ziemlich am Anfang notiert werden muss, und auch nur deshalb richtig gelesen werden kann, weil man annimmt, dass eine zu ASCII kompatible Kodierung verwendet wird.

        Was natürlich nichts bringt, wenn ich in bei einer Ansi-Datei UTF8 im <Meta> angebe.

        Solange keine Zeichen oberhalb von U+007F vorkommen ist es egal, ob du ASCII oder ISO-8859-irgendwas oder UTF-8 angibst. Das ist in dem Fall alles zueinander kompatibel.

        dedlfix.