UTF-8 und deutsche Umlaute

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • UTF-8 und deutsche Umlaute

    Hallo,

    ich möchte von einigen HTML-Dateien eine komplette Wortliste anlegen. Die HTML-files sind im Header ohne Zeichensatz definiert:
    Code:
    <!doctype html public "-//W3C//DTD HTML 4.0 //EN">
    Meine PHP-Datei ist mit UTF-8 definiert:
    Code:
    <?php header('Content-Type: text/html; charset=UTF-8');
    Ich lese also die Datei in den String $HTML ein, bzw. den reinen Text in $HTMLDOM.
    Code:
    $HTML = "";
       $fp = @fopen($myfile, "r") or
          die ("Kann Datei " . $myfile . " nicht lesen.");
       while ($line = fgets($fp, 1024)) {
          $HTML = $HTML . " " . $line;
       }
       fclose($fp);
    
    
       $doc = new DOMDocument();
       if (@$doc->loadHTMLFile($myfile) == FALSE) {
          echo "Fehler bei der DOM-Objekt-Erzeugung von " . $myfile . "<br>";
       }
    
       $HTMLDOM = "";
       $elements = $doc->getElementsByTagName('body');
       if (!is_null($elements)) {
          foreach ($elements as $element) {
             $nodes = $element->childNodes;
             foreach ($nodes as $node) {
                if (strcmp($node->nodeName, "script") != 0) {
                   $HTMLDOM = $HTMLDOM . " " . $node->nodeValue . " ";
                }
             }
          }
       }
    Dann scanne ich den String in $HTMLDOM nach einzelnen Wörtern (diese können beinhalten: a..z A..Z 0..9 Sonderzeichen -) durch.

    Code:
    $pos = 0;
          $komplett = array();
          $text = "";
          while ($pos < strlen($HTMLDOM)) {
             $z = substr($HTMLDOM, $pos, 1);
             if ( ($z >= 'A' and $z <= "Z") or ($z >= 'a' and $z <= "z") or ($z >= '0' and $z <= "9") or
                  $z == "-" or $z == utf8_encode("ü") or $z == utf8_encode("ö") or $z == utf8_encode("ä") or
                  $z == utf8_encode("ß") or $z == utf8_encode("Ü") or $z == utf8_encode("Ö") or
                  $z == utf8_encode("Ä") or $z == utf8_encode("&uuml;") or $z == utf8_encode("ouml;") or
                  $z == utf8_encode("&auml;") or
                  $z == utf8_encode("ß") or $z == utf8_encode("&Uuml;") or $z == utf8_encode("&Ouml;") or
                  $z == utf8_encode("&Auml;") or $z == utf8_encode("Ã") ) {
                $text = $text . $z;
             } else {
                if (strlen($text) >= 2) {
                   $komplett[] = $text;
                }
                $text = "";
             }
             $pos = $pos + 1;
          }
    Leider funzt das mit den Sonderzeichen nicht. Ich habe es mit und ohne utf8_encode versucht. Irgendeinen Tipp, was ich falsch mache?

    Danke!!!

  • #2
    DOMDocument decodiert die Umlaute automatisch. Du brauchst da nichts machen. Ich versteh den Sinn von deinem kompletten Code nicht.

    Kommentar


    • #3
      Wie gesagt, ich möchte die Worte einzeln in ein Array schreiben. Ich dachte zuerst, ich scanne $HTMLDOM jeweils nach Spaces, aber das hat leider auch nicht funktioniert. Da scheinen auch andere zwischen den Wörtern zu sein.

      Leider funktioniert ein Vergleich wie im folgenden nicht:
      $z == utf8_encode("Ü") oder $z == "Ü"

      Kommentar


      • #4
        Womit DomDocument übrigens überhaupt nicht klar kommt, sind Ligaturen. Viel Spaß damit!
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          @unset

          Ich habe bei Wikipedia nachgeschaut, was das sein soll. Aber was hat das mit DOM zu tun? Verstehe ich leider noch nicht ganz.

          Kommentar


          • #6
            Soviel und wenig wie Umlaute.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Zitat von beginner123 Beitrag anzeigen
              ...

              ich möchte von einigen HTML-Dateien eine komplette Wortliste anlegen. ...

              PHP-Code:
                 // ...
                 
              $doc = new DOMDocument();
                 if (@
              $doc->loadHTMLFile($myfile) == FALSE) {
                    echo 
              "Fehler bei der DOM-Objekt-Erzeugung von " $myfile "<br>";
                 }

                 
              $HTMLDOM "";
                 
              $elements $doc->getElementsByTagName('body');
                 
              // ... 
              Dann scanne ich den String in $HTMLDOM nach einzelnen Wörtern (diese können beinhalten: a..z A..Z 0..9 Sonderzeichen -) durch.

              PHP-Code:
              //... noch mehr PHP 
              Würde strip_tags() nicht ausreichen, um an den Teil des HTML zu kommen, in dem du die Wörter zählen möchtest?

              PHP-Code:
              $cdata strip_tags(file_get_contents($myfile));

              // das /u steht fuer UTF-8 (nicht fuer UNGREEDY):
              $word_count preg_match_all('/\pl+/u'$cdata$hits);

              // und wenn ich diesen Parameter von preg_match_all() 
              // richtig in Erinnerung habe:
              $komplett $hits[0]; 
              // ansonsten schaust du per var_dump($hits) mal nach 
              "/\pl+/" zählt jetzt nur Wörter, die ausschließlich aus Buchstaben bestehen. Für weitere Unicode-Zeichenklassen bitte das Handbuch befragen.

              Eventuell wirst du vorher den Bereich einschränken wollen, bspw. auf das body-Element. Das kannst du mit 'ner DOM-Klasse erledigen. Ich würde für diesen Fall preg_match() benutzen.

              Das mit den Ligaturen verstehe ich auch nicht, obwohl ich sie, vom typographischen Standpunkt aus betrachtet, durchaus als Bereicherung ansehe.
              Zuletzt geändert von fireweasel; 25.01.2011, 13:52.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar

              Lädt...
              X