mixmastertobsi: new DOMDocument() Problem

Hallo,

ich möchte aus einem String den verwendeten Charset auslesen. Ich habe es mit new DOMDocument() probbiert, doch leider bricht das Script ab, wenn ich new DOMDocument() in der Class verwenden möchte. Wenn ich es ausserhalb der Class verwende funktioniert es einwandfrei. Das kuriose ist - ich bekomme in den Logs keinen Error angezeigt und die Ausgabe bleibt beim Skript-Aufruf auch nur weiß.

Anders gefragt - gibt es ggf. noch eine andere Möglichkeit aus einem String den verwendeten Charset auszulesen?

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
....
  1. Hallo mixmastertobsi,

    ich möchte aus einem String den verwendeten Charset auslesen.

    Die tatsächlich verwendete Zeichenkodierung kannst du nur erraten.

    Anders gefragt - gibt es ggf. noch eine andere Möglichkeit aus einem String den verwendeten Charset auszulesen?

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    

    Du kannst die Attributwerte der entsprechenden meta-Elemente auslesen. Damit kriegst du aber nur raus, welche Zeichencodierung behauptet wird, verwendet zu werden.

    Warum ist dein Beitrag mit php getagt?

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Das PHP Tag hat er wohl genutzt weil DOMDocument eine Klasse aus der "DOM" Erweiterung von PHP ist.

      Warum new DOMDocument() bei Dir in einer Klasse abraucht und keinen Fehler schmeißt, kann man jetzt nur raten, da wir den Rest deiner Anwendung nicht kennen und nicht wissen, wie dein Fehlerhandling allgemein tickt.

      Einer meiner Lieblingsfehler in dem Zusammenhang ist, namespaces zu verwenden und dann bei PHP Komponenten den vorangestellten Backslash zu vergessen, dann findet er sie nicht. Aber es rappelt dann immer ganz laut und deutlich.

      Wenn es dir darum geht, den charset-Eintrag aus dem Content-Type Metatag zu isolieren, würde ich Dir zu einer Regex raten.

      Rolf

      1. Hallo Rolf b,

        Das PHP Tag hat er wohl genutzt weil DOMDocument eine Klasse aus der "DOM" Erweiterung von PHP ist.

        Ja. Aber warum soll man mithilfe von PHP eine Zeichenkodierung eines (fremden?) Dokuments erraten wollen. Für die eigenen Dokumente sollte man die verwendete Kodierung wohl wissen.

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  2. Tach!

    ich möchte aus einem String den verwendeten Charset auslesen.

    Dabei sind Ergebnisse zwischen "vielleicht richtig" und "unmöglich" zu erzielen. Wenn man UTF-8 als eine mögliche Kodierung annimmt, kann man testen, ob das Dokument den UTF-8-Regeln entspricht. Dabei kann man falsch liegen, wenn zufällig zwei Bytes eine gültige UTF-8-Sequenz ergeben, aber Zeichen anderer Kodierung darstellen sollen. Bei Ein-Byte-Kodierungen ist es unmöglich, die passende zu erkennen. Woran will man denn festmachen, ob das Byte nun das Zeichen aus der Kodierung oder aus der anderen Kodierung ist, wenn alle die Bytes 0..255 verwenden?

    Praktisch kannst du so vorgehen, dass du dich auf UTF-8 und ISO-8859-1 oder Windows-1252 beschränkst und alles andere als unwahrscheinlich ignorierst. Die Antwort auf die Frage ob eine gültige UTF_8-Sequenz vorliegt, entscheidet dann zwischen den beiden Möglichkeiten.

    Ich habe es mit new DOMDocument() probbiert, doch leider bricht das Script ab, wenn ich new DOMDocument() in der Class verwenden möchte.

    Ein XML-Parser ist darauf angewiesen, den Text lesen zu können. Er muss dazu bereits wissen, welche Kodierung vorliegt, sonst weiß er ja nicht, für welche Zeichen die gelesenen Bytes stehen. Üblicherweise gehen XML-Parser von UTF-8 aus, wenn ihnen keine andere Kodierung mitgeteilt wird.

    Wenn ich es ausserhalb der Class verwende funktioniert es einwandfrei.

    Was auch immer das konkret bedeutet ...

    Das kuriose ist - ich bekomme in den Logs keinen Error angezeigt und die Ausgabe bleibt beim Skript-Aufruf auch nur weiß.

    Dann solltest du mal die Einstellungen zu error_reporting und display_errors sowie error_log und log_errors überprüfen. Deine php.ini ist bestimmt für Produktivumgebungen konfiguriert.

    Anders gefragt - gibt es ggf. noch eine andere Möglichkeit aus einem String den verwendeten Charset auszulesen?

    "Auslesen" kann man nur, wenn man etwas lesen kann. Prinzipbedingt geht es nicht, dass man die Kodierungsinformation innerhalb des Dokuments stehen hat, wenn man nicht zumindest den Teil bereits lesen kann, in dem sie steht. Bei HTML-Dokumenten kann der Browser die im Dokument stehende Information auch nur deshalb lesen, weil er annimmt, dass der erste Teil ASCII-kodiert ist. (Eine der Möglichkeiten. Eine andere wäre, die BOM auszuwerten, wenn eine da ist.) Findet er keine Information, rät er auch nur anhand von Indizien.

    Für dich bedeutet das, dass du zunächst auf anderen Wegen die Kodierungsinformation ermitteln musst, und erst dann das Dokument dem XML-Parser übergeben kannst.

    dedlfix.

  3. Moin,

    die meta-Tags sind nicht geschlossen, falls das folgende XML sein soll:

    <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="Generator" content="Microsoft Word 14 (filtered medium)">
    ....
    

    Vielleicht hilft das bei der Fehlersuche weiter.

    Viele Grüße
    Robert

    1. @@Robert B.

      […] falls das folgende XML sein soll:

      <html  xmlns="http://www.w3.org/TR/REC-html40">
      

      Und wo ich’s grad sehe: Der Namensraum für (X)HTML sollte http://www.w3.org/1999/xhtml sein.

      LLAP 🖖

      --
      “I love to go to JS conferences to speak about how to avoid using JavaScript. Please learn CSS & HTML to reduce your JS code bloat.” —Estelle Weyl