Wieder mal char-Probleme

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

  • Wieder mal char-Probleme

    Hallo, ich lese eine Website aus, doch die Anführungszeichen kommen trotz ENT_QUOTES verstümmelt als Fragezeichen zurück. Mein php, das auf Vorschläge aus dem Forum zurückgeht sieht so aus:

    PHP-Code:
    <?php

    /*error_reporting( -1 );
    ini_set('display_errors', TRUE);
    */

    $data file_get_contents('http://www.webseite.de/sachsen/');
    $data utf8_decode($data);

    $doc = new DOMDocument(); 
    $doc->loadHTML($data); 

    $xPath = new DOMXPath($doc);

    $zaehler 0;
    foreach (
    $xPath->query('//h1/a') as $element
    {    
       

         
    $href $element->getAttribute('href');
         
    $hreft "http://www.webseite.de" $href;
         
    $title $element->nodeValue

       
    /*$title = $element->getAttribute('title');*/
            


    If ($zaehler <= 13)
        {

    echo 
    "<li><a href=\"".htmlspecialchars($hreftENT_QUOTES)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTES)."</a></li>\n"


                     
    $zaehler++;
               }
        }  


    ?>


    </ul>
    Im Quelltext der Webseite sieht es so aus:

    HTML-Code:
     <h1>       <a title="Polizeieinsatz gegen „Reichsbürger“" 
    href="/sachsen/polizeieinsatz-gegen-reichsbuerger-2556336.html">
    Polizeieinsatz gegen „Reichsbürger“ </a>     </h1>
    Ausgegeben wird es so:

    Code:
    [URL="http://www.sz-online.de/sachsen/polizeieinsatz-gegen-reichsbuerger-2556336.html"]Polizeieinsatz gegen ?Reichsbürger? [/URL]
    Wie kriege ich die Fragezeichen in Anführungsstriche gewandelt.

    Gruß und Dank newbie 1955

  • #2
    Setzt du auf deiner Seite den richtigen Zeichensatz?

    Kommentar


    • #3
      charset

      Hallo, bei mir auf der Seite:

      HTML-Code:
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      Auf der eingelesenen Seite
      HTML-Code:
         <meta charset="utf-8" />
      Alle anderen Seiten kommen ja auch richtig.

      Kommentar


      • #4
        Der meta-Tag wird vom Browser nicht beachtet. Du musst den Zeichensatz im HTTP-Header setzen.

        PHP-Code:
        header('Content-Type: text/html; charset=utf-8'

        Kommentar


        • #5
          Ergänzung

          Auf der Seite steht offenbar links das "&bdquo;", aber mit str_replace kann ich es auch nicht ersetzen. Gibt es eine direkt Möglichkeit herauszufinden, wie ein bestimmtes Zeichen auf der Seite Kodiert wurde? urlencode hilft ja auch nicht.

          Kommentar


          • #6
            Der DOM-Parser wird, vermute ich, die Entities durch die entsprechende Zeichen automatisch ersetzen. Also da solltest du nichts mehr tun müssen. Entities haben keine Kodierung, sondern sie entsprechen unabhängig von der Kodierung immer dem selben Zeichen.

            Bei htmlspecialchars() musst du übrigens als dritten Parameter auch die richtige Zeichenkodierung angeben.

            Kommentar


            • #7
              chars

              also das mit der richtigen Zeichenkodierung bei htmspecialchars habe ich hier

              PHP htmlspecialchars() Function

              nicht gefunden.


              Und das Setzen des Zeichensatzes im HTTP-Header hat nicht geholfen.
              Aber dennoch danke für den Hinweis!

              Auch ein define('CHARSET', 'UTF-8'); half nix
              Zuletzt geändert von newbie1955; 20.04.2013, 15:36.

              Kommentar


              • #8
                Defines encoding used in conversion. If omitted, the default value for this argument is ISO-8859-1 in versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards.

                For the purposes of this function, the encodings ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, provided the string itself is valid for the encoding, as the characters affected by htmlspecialchars() occupy the same positions in all of these encodings.


                PHP: htmlspecialchars - Manual

                Kommentar


                • #9
                  Ja,

                  ich glaube es Dir ja, ich wollte nur sagen, dass nicht überall darauf hingewiesen wird und auch in den diversen Manuals sehr sehr viele Anwendungsbeispiele aufgeführt sind ohne Angabe des Zeichensatzes. Danke für den Hinweis.

                  Aber auch das hat leider die Fragezeichen nicht in Anführungsstriche verwandelt ausgegeben.

                  Kommentar


                  • #10
                    Ich hab es jetzt mal selber ausprobiert. Das Problem ist, dass die eingelesene HTML-Seite kaputt ist.
                    HTML-Code:
                    <meta charset="utf-8" />
                    ist kein gültiger HTML-Code. Es müsste lauten:
                    HTML-Code:
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                    Du kannst den DOM-Parser dazu überreden trotzdem UTF-8 zu verwenden, wenn du folgendes machst:
                    PHP-Code:
                    $doc->loadHTML('<?xml encoding="UTF-8">' . $data);
                    Ist zwar nicht besonders schön, aber wenn schon der Source kaputt ist, gibts entweder die Möglichkeit ihn zu reparieren (also in dem du dich an den Seitenbetreiber wendest) oder versuchen Workarounds zu basteln. Es kann natürlich sein, dass der Workaround irgendwann nicht mehr funktioniert, wenn der Seitenbetreiber auf die Idee kommt auf seiner Seite rumzubasteln.

                    Edit: Nach "UTF-8"> fehlt übrigens ein Hochkomma. Das hat die Foren-Software verschluckt.
                    Zuletzt geändert von h3ll; 20.04.2013, 17:21.

                    Kommentar


                    • #11
                      utf8_decode

                      Hallo,

                      wenn die Web-Seite UTF-8-kodiert ist, wird sie durch die zweite Zeile

                      $data = utf8_decode($data);

                      verstümmelt. Die Gänsefüßchen sind nämlich gar kein Bestandteil von ISO-8859-1. Kurz: "utf8_decode" ist nur dann (möglicherweise) sinnvoll, wenn man sicher ist, dass alle vorkommenden Zeichen auch in ISO-8859-1 dargestellt werden können.
                      Zuletzt geändert von mephisto111; 20.04.2013, 17:31.

                      Kommentar


                      • #12
                        Danke, aber..

                        ...trotzdem werden immer Fragezeichen ausgegeben statt der beknackten QUotes-unten.

                        Ich habe Deinen Vorschlag übernommen - und noch ein ' ergänzt.

                        Mein PHP sieht jetzt so aus:

                        PHP-Code:
                        <?php

                        /*error_reporting( -1 );
                        ini_set('display_errors', TRUE);
                        */
                        define('CHARSET''UTF-8');
                        $data file_get_contents('http://www.sz-online.de/sachsen/');
                        $data utf8_decode($data);

                        $doc = new DOMDocument(); 
                        $doc->loadHTML('<?xml encoding="UTF-8">' $data);

                        $xPath = new DOMXPath($doc);

                        $zaehler 0;
                        foreach (
                        $xPath->query('//h1/a') as $element
                        {    
                           

                             
                        $href $element->getAttribute('href');
                             
                        $hreft "http://www.sz-online.de" $href;
                             
                        $title $element->nodeValue
                             
                        $search "„";
                           
                        /*$title = $element->getAttribute('title');*/
                                
                        str_replace ($search '"'$title);
                        str_replace ($search '"'$hreft);

                        If (
                        $zaehler <= 13)
                            {

                        urlencode ($title);

                        echo 
                        "<li><a href=\"".htmlspecialchars($hreftENT_QUOTESUTF-8false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTESfalse)."</a></li>\n"


                                         
                        $zaehler++;
                                   }
                            }  


                        ?>


                        </ul> 

                          </div>
                        Habe ich noch was übersehen? Ich verstehe nicht, dass er doch alles andere offenbar korrekt in utf-8 ausgibt und nur diese Anführungzeichen nicht. Gibt es denn keinen Weg, diese speziellen Zeichen zu ersetzen?

                        Gruß
                        newbie1955

                        Kommentar


                        • #13
                          Das war's

                          Zitat von mephisto111 Beitrag anzeigen
                          Hallo,

                          wenn die Web-Seite UTF-8-kodiert ist, wird sie durch die zweite Zeile

                          $data = utf8_decode($data);

                          verstümmelt. Die Gänsefüßchen sind nämlich gar kein Bestandteil von ISO-8859-1. Kurz: "utf8_decode" ist nur dann (möglicherweise) sinnvoll, wenn man sicher ist, dass alle vorkommenden Zeichen auch in ISO-8859-1 dargestellt werden können.

                          hallo, mephisto, danke, das war's, obwohl ich es nicht so ganz nachvollziehen kann, wie das kam, denn das utf8_decode, war ja ein Versuch, die von Beginn an ausgegebenen Fragezeichen "loszuwerden". Naja, es funktioniert jedenfalls. Danke!

                          Kommentar


                          • #14
                            Wie mephisto schon geschrieben hat: utf8_decode() ändert alle Zeichen, die nicht im ISO-8859-1 Zeichensatz vorkommen, in ein Fragezeichen. Was soll sie auch sonst tun? Das ist ihr definiertes Verhalten, das auch im PHP-Handbuch steht.

                            PHP-Code:
                            $pi 'π';

                            echo 
                            $pi// π
                            echo utf8_decode($pi); // ? 
                            Zuletzt geändert von h3ll; 20.04.2013, 17:41.

                            Kommentar


                            • #15
                              Zitat von newbie1955 Beitrag anzeigen
                              PHP-Code:
                              echo "<li><a href=\"".htmlspecialchars($hreftENT_QUOTESUTF-8false)."\" target=\"_blank\">".htmlspecialchars($titleENT_QUOTESfalse)."</a></li>\n"
                              Noch eine Kleinigkeit, UTF-8 wird wie ein String mit Anführungszeichen notiert.

                              [..., string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

                              Kommentar

                              Lädt...
                              X