Sesquialtera: Encoding mismatch mit DOMDocument::saveHTML

Hallo,
ich habe folgendes hartnäckige Problem:

aus einem HTML file "content.html" soll der Inhalt (innerHTML) eines Tags ausgelesen werden. Das ganze soll im PHP-File "main.php" vor sich gehen. Ich habe dazu die DOMDocument Class (libxml2) verwendet.

Im 'main.php' wird als das html File eufgerufen und der Dokumentbaum an libxml2 übergheben:

  
$dom->loadHTMLFile("content.html");  

Ich greife auf das gewünschte DOMElement zu und lese rekursiv alle Subelements in des neue $tmp_dom = new DOMDocument('1.0','utf-8'); ein.
Bei der Ausgabe in 'main.php' per echo $tmp_dom->saveHTML(); werden alle Umlaute in der falschen Kodierung ausgelesen und nicht richtig dargestellt.

Beide files sind als utf-8 kodiert, in der 'main.php' ist dies auch dekalariert (<meta http-equiv="content-type" content="text/html;charset=utf-8">.

Wenn ich 'content.html' mit iconv in 'latin-1' verwandle, stimmt der Output von echo $tmp_dom->saveHTML();!

Versteht DOMDocument::loadHTML/saveHTML kein UTF-8? Ich möchte nicht auf latin-1 umsteigen müssen, da ich seit langem alle Apps auf UTF-8 konvertiert habe.

Weiß jemand Abhilfe?

Vielen Dank fürs Posten!!
Franz

  1. Hallo,

    Bei der Ausgabe in 'main.php' per echo $tmp_dom->saveHTML(); werden alle Umlaute in der falschen Kodierung ausgelesen und nicht richtig dargestellt.

    Naja, "ausgelesen"? "Ausgegeben" oder? Du meinst, DOM gibt latin aus, obwohl du es mit utf-8 initialisiert hast? Glaub ich nicht wirklich.

    Gruß

    jobo

    1. Hallo,

      Bei der Ausgabe in 'main.php' per echo $tmp_dom->saveHTML(); werden alle Umlaute in der falschen Kodierung ausgelesen und nicht richtig dargestellt.

      Naja, "ausgelesen"? "Ausgegeben" oder? Du meinst, DOM gibt latin aus, obwohl du es mit utf-8 initialisiert hast? Glaub ich nicht wirklich.

      Gruß

      jobo

      Hm, probier bitte mal den Test:

        
      $txt = "<div>wäüÜoß</div>";  
      $dom2->loadHTML($txt);  
      echo $dom2->saveHTML();
      

      Wenn das PHP-File mit diesem Code utf-8 kodiert (:filencoding=utf8) ist, ergibt das echo Müll, wenn du es latin-1 (:filencoding=latin1) kodierst, kommen korrekte deutsche Sonderzeichen !

      Gruß, Franz

  2. Hi,

    Bei der Ausgabe in 'main.php' per echo $tmp_dom->saveHTML(); werden alle Umlaute in der falschen Kodierung ausgelesen und nicht richtig dargestellt.

    Hast du probiert, die verwendete Kodierung beim Erstellen der DOMDocument-Instanz mal explizit zu setzen?

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      Bei der Ausgabe in 'main.php' per echo $tmp_dom->saveHTML(); werden alle Umlaute in der falschen Kodierung ausgelesen und nicht richtig dargestellt.

      Hast du probiert, die verwendete Kodierung beim Erstellen der DOMDocument-Instanz mal explizit zu setzen?

      MfG ChrisB

        
      $dom = new DOMDocument('1.0','utf-8');  
      $dom->loadHTMLFile("content.html");  
      
      

      hätte ich versucht.

      Danke. Franz

      1. Hi,

        $dom = new DOMDocument('1.0','utf-8');
        $dom->loadHTMLFile("content.html");

        
        > hätte ich versucht.  
          
        Was ergibt die Kontrollausgabe von $dom->encoding nach dem Laden des HTML-Dokumentes?  
          
        MfG ChrisB  
          
        
        -- 
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        
        1. Hi,

          $dom = new DOMDocument('1.0','utf-8');
          $dom->loadHTMLFile("content.html");

          
          > > hätte ich versucht.  
          >   
          > Was ergibt die Kontrollausgabe von $dom->encoding nach dem Laden des HTML-Dokumentes?  
          >   
          > MfG ChrisB  
          >   
          >   
          
          Danke. Diese Eigenschaften  $dom->encoding, $dom->actualEncoding etc. waren alle "" solange im Quelldokument 'content.html' nicht die Mata info `<meta http-equiv="content-type" content="text/html; charset=utf-8"/> `{:.language-html} stand.  
            
          Siehe auch mein [SOLVED] Kommentar.  
            
          Danke für eure Antworten und hzl. Gruß,  
          Franz
          
  3. Beide files sind als utf-8 kodiert, in der 'main.php' ist dies auch dekalariert (<meta http-equiv="content-type" content="text/html;charset=utf-8">.

    [SOLVED] im xhtml File 'content.html' hatte im header die Angabe
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/> gefehlt (Oxygen schreibt das nicht per default hin).

    Erst mit dieser Ergänzung liest und verarbeitet die DOMDocument Klasse das File als utf-8, sonst standardmäßig offenbar latin-1.

    Danke fürs Mitdenken!
    Hrzl. Grüße, Franz