Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie erkenne ich in einem RSS-Feed die Zeichenkodierung?

Einklappen

Neue Werbung 2019

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

  • Wie erkenne ich in einem RSS-Feed die Zeichenkodierung?

    Hallo,

    ich habe ein Problem mit der Darstellung von Umlauten bei RSS-Feeds.

    Ich möchte auf einer Homepage verschiedene RSS-Feeds anzeigen. Ich verwende dazu den RSS-Parser von Stefan Fischer.

    Leider bekomme ich es nicht hin, die Kodierung des jeweiligen RSS-Feeds abzufragen. Stelle ich meine Webseite auf iso-8859-1 ein, werden die Umlaute bei UTF-8-kodierten Feeds falsch dargestellt, nehme ich für die Webseite UTF-8, gehen iso-8859-1-Feeds nicht.

    Wie stelle ich fest, wie die Quelldatei codiert ist? Der von mir verwendete RSS-Parser baut auf dem XML-Parser-Modul von PHP, und nach Möglichkeit möchte ich es vermeiden, den Kopf des Feeds mit einer anderen Technik noch mal scannen zu müssen.

    Viele Grüße,
    Tharion

  • #2
    Prüfe, ob der ankommende Text UTF-8-kodiert ist, und dann transformiere ihn in die Kodierung, die du brauchst. Hier ein Vorschlag für solch eine Prüfung:
    PHP-Code:
    <?php
        
    function is_utf8_compatible($str)
        {
            
    /**
             * Prueft, ob ein String UTF-8-kompatibel ist.
             * Suchmuster von Martin Duerst
             * [url]http://www.w3.org/International/questions/qa-forms-utf-8.html[/url]
             * @return boolean
             * @author Thomas Scholz
             */
            
    return preg_match("/^(
                     [\x09\x0A\x0D\x20-\x7E]            # ASCII
                   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
                   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
                   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
                   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
                   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
                   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
                  )*$/x"
    $str);
        }
    ?>
    Das Transformieren kriegst du sicher selbst hin.

    Gruß
    Thomas

    Kommentar


    • #3
      Hallo,

      naja, im Dokument eines RSS-Feeds steht die Codierung normalerweise oben drin:
      Code:
        <?xml version="1.0" encoding="utf-8" ?> 
        <!--  generator="wordpress/1.2.2" 
        --> 
        <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
        <channel>
      [...]
      Ich hatte nur gehofft, der XML-Parser von PHP würde diese Codierung automatisch erkennen, und ich könnte diesen Wert über eine Funktion oder Eigenschaft des Parsers irgendwie abfragen.

      Ich habe es mit
      Code:
      $encode_type = xml_parser_get_option( $this->parser, XML_OPTION_TARGET_ENCODING);
      versucht, aber da bekomme ich nur iso-8859-1 als Ergebnis, egal wie das Dokument tatsächlich codiert ist.

      So muss ich halt die erste Zeile der Datei noch mal extra einlesen und mit ner eigenen Funktion auswerten. Die Arbeit wollte ich mir sparen.

      Viele Grüße,
      Tharion

      Kommentar


      • #4
        Der XML-Parser in PHP unterstellt immer erstmal ISO-8859-1; das ist ein elender Bug, ja. Die oben genannte Funktion erspart dir das zusätzliche Auslesen der ersten Zeile und ermittelt auch falsch deklarierte XML-Dokumente (davon gibt es leider zuviele).

        Kommentar


        • #5
          Hallo,

          vielen Dank für die Hilfe. Jetzt funktioniert das Ganze - fast zumindest. Ein Feed widersetzt sich hartnäckig der richtigen Darstellung. Aber ich glaube, den ignoriere ich jetzt.

          Viele Grüße und noch mal Danke,
          Tharion

          Kommentar


          • #6
            Manchmal hilft noch http://de2.php.net/mb_detect_encoding – wenn die MB-Funktionen bei dir zugelassen sind. Das mußt du mit function_exists('mb_detect_encoding') kontrollieren. Ich kann aber nichts zur Zuverlässigkeit dieser Funktion sagen, weil ich solch »blindes« Arbeiten eigentlich lieber vermeide.

            Gruß
            Thomas

            Kommentar

            Lädt...
            X