Heiko: Sonder- wie Satzzeichen werden deformiert dargestellt

Hallo,

Wenn ich Links mit PHP auslese, bekomme ich statt der deutschen Sonderzeichen oder Satzzeichen Stoßgeburten wie ö oder ä

Wie kann ich diese Satz-/Sonderzeichen richtig übersetzen?

Danke, LG, Heiko

  1. Okay, vielleicht ein wenig deutlicher, also ich lese via $element->getAttribute("title") die Titel Attribute aus, bekomme dann aber Resultate wie ö, ä oder â[][].

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

    scheint keine Wirkung zu zeigen - und utf8_encode ist seit PHP 8.2.0 deprecated.

    1. @@Heiko

      statt der deutschen Sonderzeichen

      Was sind „deutsche Sonderzeichen“? ä, ö, ü, ß und ihre großen Pendants Ä, Ö, Ü, ẞ sind keine Sonderzeichen, sondern ganz normale Zeichen.

      Sonderzeichen im HTML-Kontext sind < und &, in Attributwerten auch " bzw. '.

      Okay, vielleicht ein wenig deutlicher, also ich lese via $element->getAttribute("title") die Titel Attribute aus, bekomme dann aber Resultate wie ö, ä oder â[][].

      Das sieht danach aus, dass deine Quelldaten UTF-8-codiert sind und du die Bytesequenzen irgendwo einbaust, was als ISO-8859-1 o.ä. verarbeitet wird. Darin liegt das Grundübel. Verwende UTF-8, immer und überall!

      (Oder glaubst du, UTF-8 zu verwenden, lässt deinen Server aber etwas anderes sagen?)

      scheint keine Wirkung zu zeigen - und utf8_encode ist seit PHP 8.2.0 deprecated.

      Scheint mir auch die falsche Richtung zu sein. utf8_decode() wäre es wohl.

      Dass die Funktionen deprecated sind, weißt du woher? Aus der PHP-Doku? Unter „Siehe auch“ hast du nicht auch gesehen?

      Aber sinnvoll wäre es wohl, dein Zeugs UTF-8-codiert auszuliefern.

      🖖 Живіть довго і процвітайте

      --
      When the power of love overcomes the love of power the world will know peace.
      — Jimi Hendrix
  2. Moin,

    Wenn ich Links mit PHP auslese, bekomme ich statt der deutschen Sonderzeichen oder Satzzeichen Stoßgeburten wie ö oder ä

    in welchem Kontext bekommst du das angezeigt?

    Das sieht so aus, als sei die gesamte Webseite ordentlich in UTF-8 codiert aufgebaut, aber du interpretierst jetzt Teile davon in einer 1-Byte-Codierung wie z.B. ISO 8859-x.

    Alle Zeichen außerhalb des ASCII-Bereichs (also Codepoints oberhalb von U+007F) werden in UTF-8 mit zwei oder mehr Bytes codiert. Gibt man das ohne Umschweife in einem Kontext aus, bei dem der Browser (oder der Bediener) kein UTF-8 erwartet, werden diese zwei oder mehr Bytes als einzelne Zeichen interpretiert und angezeigt.

    Wie kann ich diese Satz-/Sonderzeichen richtig übersetzen?

    Du brauchst vermutlich nichts zu übersetzen. Du musst das Ergebnis nur richtig interpretieren und/oder die Codierung UTF-8 an geeigneter Stelle angeben. Welche Stelle das ist, geht aus deiner spärlichen Information leider nicht hervor.

    Einen schönen Tag noch
     Martin

    --
    "Was sind denn das für Beeren?" - "Das sind Blaubeeren." - "Warum sind sie dann rot?" - "Weil sie noch grün sind."
    1. Wenn ich Links mit PHP auslese, bekomme ich statt der deutschen Sonderzeichen oder Satzzeichen Stoßgeburten wie ö oder ä

      Alle Zeichen außerhalb des ASCII-Bereichs (also Codepoints oberhalb von U+007F) werden in UTF-8 mit zwei oder mehr Bytes codiert. Gibt man das ohne Umschweife in einem Kontext aus, bei dem der Browser (oder der Bediener) kein UTF-8 erwartet, werden diese zwei oder mehr Bytes als einzelne Zeichen interpretiert und angezeigt.

      Gibt man das ohne Umschweife in einem Kontext aus, bei dem dem eine Software kein UTF-8 erwartet oder in dem eine PHP-Funktion dieses nicht korrekt verarbeit, werden diese zwei oder mehr Bytes als einzelne Zeichen interpretiert und angezeigt.

      @@Heiko:

      Entweder wird die von die gesehene Webseite aus $Gründen als eine solche in einer anderen Kodierung erkannt oder etwas wie das hier

      $element->getAttribute("title")
      

      geht schief.

      Das ist ja offensichtlich eine Methode eines Objektes. Ist es diese hier? Dann lese auch hier nach. und, falls Du DOMDocument::loadHTML benutzt, auch dort.

      Lass uns nicht soviel herumraten, was Du tust, zeige den kompletten Weg der Daten von der Quelle (die wir sehen müssen, weil diese schon falsche Informationen enthalten kann.) über das Abholen (und die Erzeugung des Objektes, wenn es eine eigene Klasse ist, dann diese) und jeden Verarbeitungsschritt bis hin zur Anzeige, welche Du uns bitte auch beschreiben möchtest, denn es gibt nicht nur den Browser…

      Ansonsten musst selbst diese Schritte einzeln überprüfen. Niemand hat gesagt, dass das Debuggen logischer Fehler leicht und einfach sei.

      1. Hallo, sorry für die späte Antwort.

        Okay, anbei das gesamte Stück Code.

        Im wesentlichen will ich eine Fernsehprogramm-Webseite scrapen. Dort interessieren mich nämlich genau fünf Sender, deren Programm ich gerne übersichtlich auf einen Blick OHNE Clutter dargestellt bekommen will (sind sonst fast überall zwei bis drei Klicks, einfach ärgerlich).

        Ist auch eigentlich keine große Sache, da nur für mich und mein engeres Umfeld als Zielgruppe relevant - trotzdem treiben mich Ausgaben wie Homicide Hunter â[][] Dem Mörder auf der Spur einfach in den Wahnsinn

        $domDoc = new DOMDocument('1.0', 'UTF-8'); // vorher new DOMDocument(), Idee © Raketenwilli
        	@$domDoc->loadHTMLFile( $siteURL );
        	
        	/* ~~~~~~~~~~~
        	Schiefgelaufene Alternativen, die Codierung richtig hinzubekommen:
        	
        	@$domDoc->loadHTMLFile( mb_convert_encoding('https://www.tele.at/tv-programm/jetzt-im-tv.html', "UTF-8") );
        	@$domDoc->loadHTMLFile( '<? xml encoding="utf-8" ?>' . 'https://www.tele.at/tv-programm/jetzt-im-tv.html' );
        	
        	*/
        	
        	$xPath = new DOMXPath($domDoc);
        	$bcItems = $xPath->query("//div[@class='bc-item']");
        	
        	$relevantenProgramme = [];
        	
        
        	
        	forEach($bcItems as $bcItem) {
        		$anchors = $bcItem->getElementsByTagName("a");
        		$arrayOfSendeinhalte = [];
        		
        		forEach($anchors as $anchor) {
        			$arrayOfSendeinhalte[] = $anchor->getAttribute("title");
        		}
        
        		
        		if (in_array("ARD", $arrayOfSendeinhalte) || 
        		//in_array(...//weitere Sender
        		) {
        			$trimmedArray = array_map('trim', $arrayOfSendeinhalte);
        			$result = array_filter($trimmedArray);
        			$result = array_values($result);
        			$relevantenProgramme[] = $result;
        		}
        	}
        	
        	$relevantenProgrammeEncoded = json_encode($relevantenProgramme);
        	echo $relevantenProgrammeEncoded;
        
        1. Hallo Heiko,

          ich habe das Thema nicht genauer verfolgt, aber wenn ich das jetzt sehe, dann arbeitet irgendeine beteiligte Instanz nicht mit Unicode, bekommt aber Unicode-Text und gibt ihn als ISO-8859 Text (also klassische Codepage) aus.

          Und diese Instanz musst Du finden.

          Alternativ musst Du umcodieren. Deine loadHTMLFile Aufrufe sind beide Blödsinn.

          Der erste konvertiert nicht das geladene HTML, sondern nur die URL. Der zweite setzt eine XML-Deklaration vor die URL - das Ergebnis ist eine ungültige URL.

          Du müsstest mit file_get_contents den INHALT der Seite laden, diesen Inhalt durch mb_convert_encoding jagen (sofern er denn zu konvertieren ist, das müsstest Du ggf. unter's Mikroskop legen) und das Ergebnis mit loadHTML ins DOMDocument laden.

          Mit all den Problemen, die das auslöst. DOMDocument hat nie HTML5 gelernt und rotzt bei HTML5 Konstrukten gern mal Beschwerden in die Konsole.

          Ja, richtig, file_get_contents. Der kann auch Downloads, wenn Du ihm eine URL gibst. Falls Du für den Header setzen musst/willst, kannst Du das über einen Stream Context lösen, dazu findest Du Beispiele auf der Dokuseite der Funktion auf php.net.

          Rolf

          --
          sumpsi - posui - obstruxi
        2. Dem Skript nach sind Umlaute überhaupt nicht Dein Problem, von dem gezeigten Skript funkioniert jedenfalls gar nichts: Also weder das Abholen noch die Verarbeitung der Daten.

          • Google: EPG XML Download

          Finde etwas wie

          • https://telerising.de/epg/
          1. Dem Skript nach sind Umlaute überhaupt nicht Dein Problem, von dem gezeigten Skript funkioniert jedenfalls gar nichts: Also weder das Abholen noch die Verarbeitung der Daten.

            • Google: EPG XML Download

            Finde etwas wie

            • https://telerising.de/epg/

            Besser:

            https://github.com/iptv-org/epg