Paul: Erkennen und Lesen von Unicode- und nicht Unicode-Dateien

Hallo,

So, nach fruchtlosem Herumgesuche und Lesen von FAQ's habe ich nun
einen Grad an Verwirrung erreicht, der sich nicht mehr toppen lässt.

Folgendes Problem:

Ich lese aus einem Verzeichnis rekursiv Text- und XML-Dateien, formatiere sie, häng sie aneinander und schreibe sie wiederum in eine
HTML-Datei.

Manche sind ascii-encoded, manche utf8.
Vorkommende Stellen wie z.B. (in utf8-files):

• Image display

werden im letztendlichen Output zu:

• Image display

Meine Frage(n):

* Wie kann ich erkennen, um was für ein Encoding es sich bei der
  Textdatei handelt?

* Muss ich Perl beim Einlesen sagen, dass da jetzt utf8 kommt, oder
  den eingelesenen String dann konvertieren?

* Muss ich beim Schreiben was beachten? In welchem Encoding speichere
  ich die Dateien am Besten?

* Ich benutze Perl 5.8.0, hat das Auswirkungen?

Wie man unschwer erkennen kann, fehlt mir wohl hier und da das
grundlegende Verständnis in Sachen Character-Encoding. Wäre nett,
wenn mir jemand einpaar grundlegende Tips gibt, wo ich anfangen kann,
bzw. wie man sowas am besten angeht.

Besten Dank,
Paul

  1. Moin!

    * Wie kann ich erkennen, um was für ein Encoding es sich bei der
      Textdatei handelt?

    Das Problem ist, dass utf-8 auch genausogut als vollkommen gültiges ASCII oder ISO-8859-1 betrachtet werden kann. Im Prinzip gibt es also nur zwei Möglichkeiten:
    1. Du "weißt" es, weil du selbständig eine entsprechende Information über die in der Datei benutzte Zeichencodierungsform irgendwo mitspeicherst. Beispielsweise in einem HTML-Metatag.
    2. Du weißt es nicht, und mußt raten.

    Methode 2 ist dabei natürlich sehr stark abhängig von der Qualität des Ratemechanismus und insbesondere von den tatsächlichen Daten.

    Beispielsweise könnte es sich dann um eine UTF-8-codierte Datei handelt, wenn relativ viele 7-Bit-ASCII-Zeichen vorkommen, und verhältnismäßig viele deutsche UTF-8-Umlaute (erkennbar am charakteristischen Tilde-A). Es kann keine UTF-8-Datei sein, wenn ungültige Bytewerte darin vorkommen.

    * Muss ich Perl beim Einlesen sagen, dass da jetzt utf8 kommt, oder
      den eingelesenen String dann konvertieren?

    UTF-8 bzw. Unicode ist eigentlich der zu bevorzugende Zeichenmodus, da dir in deinen UTF-8-Dateien ja durchaus Zeichen begegnen können, die in einer 8-Bit-Zeichencodierung nicht dargestellt werden können.

    * Muss ich beim Schreiben was beachten? In welchem Encoding speichere
      ich die Dateien am Besten?

    UTF-8.

    • Sven Rautenberg
    1. Hi,

      1. Du "weißt" es, weil du selbständig eine entsprechende Information über die in der Datei benutzte Zeichencodierungsform irgendwo mitspeicherst. Beispielsweise in einem HTML-Metatag.
      2. Du weißt es nicht, und mußt raten.

      3. Die Datei verrät es durch Anwesenheit eines BOM …

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.