Antman: Unicode aus DB wird zu ISO in XML. Warum?

Hallo Forum,

Ich habe in meiner DB alles in UTF gespeichert, Nun baue ich eine XML Datei wie unten. Diese zeigt aber wieder als Umlaute schwarze Kästchen an und der Browser schaltet auf westliches ISO. Im Quelltext der XML sieht die erste Zeile so aus:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><events>

Woher kommt dieses komische zeichen am Anfang. Kommen die Probleme von diesem?

<?php
include("../../../config/config.php");
$connection = mysql_connect($host, $user, $pass) or die ('cannot reach database');
$db = mysql_select_db($database) or die ("this is not a valid database");

$language = "de";

$res = mysql_query("
    SELECT
        *, DATE_FORMAT(date_s, '%d.%m.%Y') AS date_start
    FROM
        events
    WHERE
        lang = '".$language."'
    AND
        date_s BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 200 DAY)
    AND
        active = 'y'
    ORDER BY date_s ASC ");

$events = array();
while($event = mysql_fetch_assoc($res)) {
   $events[] = $event;
}
echo "<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>";
echo "<events>\n";
// Eventschleife
for($i=0; $i < count($events); $i++) {
    echo "<event>\n";
 echo "<title  id="".$events[$i]['id']."">".$events[$i]['headline']."</title>\n";
 echo "<city>".$events[$i]['city']."</city>\n";
    echo "<start>".$events[$i]['date_s']."</start>\n";
 echo "<end>".$events[$i]['date_e']."</end>\n";
 echo "<referent>".$events[$i]['referent']."</referent>\n";
    echo "<contact>".$events[$i]['contact']."</contact>\n";
    echo "<email>".$events[$i]['email']."</email>\n";
    echo "<tel>".$events[$i]['tel']."</tel>\n";
 echo "</event>\n";
}
echo "</events>\n";
?>

  1. Tag Antman.

    Ich habe in meiner DB alles in UTF gespeichert, Nun baue ich eine XML Datei wie unten. Diese zeigt aber wieder als Umlaute schwarze Kästchen an und der Browser schaltet auf westliches ISO.

    Dann ist die "UTF-8-Kette" irgendwo unterbrochen.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?><events>
    Woher kommt dieses komische zeichen am Anfang. Kommen die Probleme von diesem?

    Ich würde sagen: ja. Du solltest vor der Ausgabe der eigentlichen Daten einen entsprechenden Header mitsenden:

    header("Content-type: text/xml; charset=utf-8");

    Vielleicht hilft's.

    Siechfred

    1. Hallo,

      header("Content-type: text/xml; charset=utf-8");

      Ah ja, jetzt wird wenigstens im Browser als Ausgabe der XML Baum ausgegeben und automatisch als Zeichnenkodierung UTF-8 gewählt.

      Die Umlaute werden trotzdem nicht korrekt angezeigt.

      1. header("Content-type: text/xml; charset=utf-8");
        Ah ja, jetzt wird wenigstens im Browser als Ausgabe der XML Baum ausgegeben und automatisch als Zeichnenkodierung UTF-8 gewählt.

        Damit wäre diese Lücke in der "UTF-8-Kette" geschlossen.

        Die Umlaute werden trotzdem nicht korrekt angezeigt.

        Dann ist irgendwo noch eine Lücke. Versuche mal, mySQL explizit aufzufordern, mit deinem PHP-Script UTF-8 zu sprechen:

        $query = "SET NAMES utf8";  
        $result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
        

        Hilft das?

        Siechfred

        1. $query = "SET NAMES utf8";

          $result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());

            
          Du meinst also diese Zeilen vor der eigentlichen Abfrage einfügen?
          
        2. Siechfred! Top!!!

          Das klappt tatsächlich! :) *happy*  Woher hast du denn diese Info?!
          Das musste ich noch nie so machen. Hat das etwas mit der Umstellung meiner mysql DB auf 5.0 zu tun?

          Muss ich das nun bei allen Skripten so machen?

          1. echo $begrüßung;

            Das klappt tatsächlich! :) *happy*  Woher hast du denn diese Info?!

            Von mir :-) oder aus dem Handbuch.

            Das musste ich noch nie so machen. Hat das etwas mit der Umstellung meiner mysql DB auf 5.0 zu tun?

            Ja. Seit MySQL 4.1 sind die Zeichensatz-Geschichten stark erweitert worden. Deswegen gab ich dir neulich die Empfehlung, das Kapitel Character Set Support zu lesen.

            Muss ich das nun bei allen Skripten so machen?

            Nein, du könntest die Konfiguration (my.ini) so ändern, dass MySQL mit Clients generell UTF-8 spricht.

            echo "$verabschiedung $name";

            1. Tag dedlfix.

              Naja, da habe ich wohl etwas getrödelt mit meiner Antwort, dafür habe ich aber den Archiv-Link zu deinem Posting rausgesucht ;-)

              Siechfred

            2. Nein, du könntest die Konfiguration (my.ini) so ändern, dass MySQL mit Clients generell UTF-8 spricht.

              Aber mein Webspace Anbieter wird mir wohl kaum Zugriff auf die my.ini gewähren, oder?

          2. Das klappt tatsächlich! :) *happy*  Woher hast du denn diese Info?!

            Von dedlfix.

            Das musste ich noch nie so machen. Hat das etwas mit der Umstellung meiner mysql DB auf 5.0 zu tun?

            Möglicherweise, wenn die Vorgängerversion kleiner 4.1 war.

            Muss ich das nun bei allen Skripten so machen?

            M.E. ja, wenn du keinen anderen Einfluss auf die Konfiguration von mySQL hast, siehe auch 10.3.6. Connection Character Sets and Collations für die verschiedenen Varianten.

            Siechfred

            1. Hallo Siechfred,

              Das klappt tatsächlich! :) *happy*  Woher hast du denn diese Info?!

              Von dedlfix.

              An manchen Tagen  finde ich das Forum schon ganz toll :)

              Grüße
              Thomas