Ollis: Einlesen von xml-Dokument ergibt fehlerhafte Zeichen

Hi,

ich versuche gerade, mittels file_get_contents eine xml-Datei (genauer eine RSS-Datei) einzulesen. Wenn ich mir die Datei aber ausgeben lasse, sind alle Sonderzeichen zu '?' umgewandelt worden (benutze Charset UTF-8). Ich weiß nicht, wie ich das umgehen könnte. Habe folgendes probiert:

$patterns = array(
  '/ß/',     // ß
  '/Ä/', '/ä/',  // Ä, ä
  '/Ö/', '/ö/',  // Ö, ö
  '/Ü/', '/ü/'  // Ü, ü
);

$replacements = array(
  'ß',      // ß
  'Ä', 'ä',   // Ä, ä
  'Ö', 'ö',   // Ö, ö
  'Ü', 'ü'   // Ü, ü
);

$data = preg_replace($patterns, $replacements, file_get_contents($file));

// AUSGABE-Beispiele:
M?nchen
f?r
verk�rpert

Weiß jemand, warum das so ist oder wie ich das verhindern kann? Mein RSS-Parser "verschluckt" nämlich alle Zeichen vor einem Sonderzeichen. Seltsamerweise scheint nach dem ersten Sonderzeichen alles wieder richtig zu funktionieren.

Gruss Olli

  1. ich versuche gerade, mittels file_get_contents eine xml-Datei (genauer eine RSS-Datei) einzulesen. Wenn ich mir die Datei aber ausgeben lasse, sind alle Sonderzeichen zu '?' umgewandelt worden (benutze Charset UTF-8). Ich weiß nicht, wie ich das umgehen könnte. Habe folgendes probiert:

    Was sagst du denn dem Browser, was er für einen Zeichensatz erwarten soll?

    Gar nichts? Irgendwas im Meta-Tag?
    Dann wird der Server deinem Browser sicher ISO-8859-1 erzählen und dann hast du den Salat... :-)

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

    sollte das beheben.

    Ansonsten kannst du auch noch die GNU Recode Funktionen oder die iconv Funktionen oder utf8_encode()/utf8_decode() verwenden.

    1. Nene, hab den Header über PHP rausschreiben lassen. Da steht schon wie von dir gesagt die entsprechende Zeile drin. Also es ist _tatsächlich_ UTF-8. Werde mir aber die iconv-Funktion mal genauer anschauen. Danke!

      Gruss Olli

  2. Hallo,

    ich versuche gerade, mittels file_get_contents eine xml-Datei (genauer eine RSS-Datei) einzulesen. Wenn ich mir die Datei aber ausgeben lasse, sind alle Sonderzeichen zu '?' umgewandelt worden (benutze Charset UTF-8).

    Wo wird charset UTF-8 genutzt?
    In welchem charset sind die Zeichen in der RSS-Datei kodiert?
    Welches charset nutzt PHP?

    $patterns = array(
      '/ß/',     // ß
      '/Ä/', '/ä/',  // Ä, ä
      '/Ö/', '/ö/',  // Ö, ö
      '/Ü/', '/ü/'  // Ü, ü
    );

    $replacements = array(
      'ß',      // ß
      'Ä', 'ä',   // Ä, ä
      'Ö', 'ö',   // Ö, ö
      'Ü', 'ü'   // Ü, ü
    );

    $data = preg_replace($patterns, $replacements, file_get_contents($file));

    Du ersetzt z.B. das Vorkommen der Entity Ä durch die Entity Ä. Was soll das bringen? Meiner Meinung nach wird da gar nichts ersetzt. Es müssten nämlich die Entities Ä ... im RSS-File stehen.

    Wenn die RSS-Datei in UTF-8 kodiert ist, dann musst Du http://de.php.net/utf8-decode benutzen.

    viele Grüße

    Axel

    1. Hi

      hab grad nochmal nachgeschaut, die RSS-Datei ist in ISO-8859-1 (also Standardzeichensatz) kodiert.

      Die "ersetzen"-Funktion hab ich reingebaut, weil es ja nicht ging. Hab ein bisschen experimentiert...

      Gruss Olli

      1. Hallo,

        hab grad nochmal nachgeschaut, die RSS-Datei ist in ISO-8859-1 (also Standardzeichensatz) kodiert.

        Warum willst Du diese Kodierung nicht beibehalten? Du kannst nicht einfach die Kodierung in UTF-8 ändern und erwarten, dass z.B. ü (\xFC) dann immer noch als ü angezeigt wird. In UTF-8 wird ü angezeigt, wenn in den Byte-Daten \xC3BC steht.

        Du könntest mit http://de2.php.net/htmlentities alle Sonderzeichen in HTML-Entities umwandeln. Im Kontext text/html ist für diese Entities das eingestellte charset dann egal.

        viele Grüße

        Axel