kostenloser Webspace werbefrei: lima-city


XML Parser liefert bei Umlaut nicht kompletten String

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    Ich habe ein kleines Problem mit meinem XML Parser...

    Grundsätzlich habe ich alles hin bekommen, wie ich es will, allerdings bekomme ich bei einem Umlaut als Inhalt eines Elements nur alles von dem Umlaut weg.

    z.B. <element>Geräte</element>
    Nach dem parsen -> Inhalt von element: "äte"

    Wenn ich die Details weg lasse, sieht mein PHP Code so aus:
    (...)
    function contents($parser, $data) {
      $inhalt =utf8_decode($data);
      echo $inhalt;
    }
    (...)
    $xml_parser = xml_parser_create();
    xml_set_element_handler($xml_parser, "startTag", "endTag");
    xml_set_character_data_handler($xml_parser, "contents");
    xml_parse($xml_parser, $xml, true);


    Der Code für's parsen an sich ist denke ich uninteressant. Wenn ich mit die Daten ausgeben lassen will, bekomme ich bei Worten mit Umlaut halt nur alles ab (und inklusive) dem Umlaut.
    utf8_decode() verwende ich nur, damit ich keine komischen Zeichen, sondern richtige Umlaute bekomme.

    Kann mir jemand sagen, warum ich nicht das vollständige Wort erhalte?
    Bzw. wie ich das vollständige Wort erhalte?

    // EDIT:
    Habe bemerkt, dass das utf8_decode() sehr wohl einen Einfluss hat.
    Es ändert mir zwar das komische Zeichen in einen Umlaut um, schneidet den Rest des Strings aber ab.

    Ich habe bei StackOverflow jemanden gefunden, der genau das gleiche Problem hat. Ihm wurde nicht geholfen, und ich habe es ebenfalls probiert. Die dort genannten Tipps funktionieren nicht (bzw. ich habe es nicht zusammengebracht.), aber vielleicht hat ja jemand von euch damit Erfahrung?!
    Link: http://stackoverflow.com/questions/4278071/utf8-decode-returns-only-a-part-of-the-encoded-string

    Danke im voraus,
    Sincer

    Beitrag zuletzt geändert: 24.8.2011 21:28:25 von sincer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. genau! da haben sich schon etliche NETTE leute die pappen franselig gesprochen darüber!!

    ALLES
    was utf-8 ist MUSS utf-8 sein! (sollen wir das alles NOCHMALS aufzählen, was ALLES ist?)

    Beitrag zuletzt geändert: 25.8.2011 0:15:26 von hemiolos
  4. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    hemiolos schrieb: (sollen wir das alles NOCHMALS aufzählen, was ALLES ist?)


    Also ich habe jetzt mal die Kodierung der PHP Datei selbst von ANSI auf UTF-8 gestellt.
    Jetzt werden mir keine kryptischen Zeichen mehr angezeigt. Der String mit einem Umlaut wird aber dennoch abgeschnitten.

    Das utf8_decode() habe ich nun weg genommen.

    Hast du noch einen Tipp für mich?

    lg
    Sincer
  5. sincer schrieb:
    ... noch einen Tipp für mich?
    mal sehen: sind alle beteiligten daten und datenquellen (xml-datei, eventuell datenbank ... [ich weiß ja nicht, wo du deine daten herbekommst]) utf-8?
    (utf-8 ist die zukunft und genau daher solltest du bei dir alles umstellen.)
  6. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    Danke für deine Hilfe :)
    Die UTF-8 Konvertierung der Datei hat mir die Sonderzeichen aus dem Weg geräumt.

    Der schwierige Fehler lag in einem Teil des Codes, der in dem geposteten Ausschnitt gar nicht zu sehen war: Dem Parsen selbst.

    http://www.php.net/manual/de/function.xml-set-character-data-handler.php:
    Character data handler is called for every piece of a text in the XML document. It can be called multiple times inside each fragment (e.g. for non-ASCII strings).


    Ich habe in meiner Funktion immer nur so etwas:
    function contents($parser, $data) {
      if(...)
        $inhalt = $data;
      // Do something...
    }


    Laut der definition kann $data aber auch nur einen Teil des Inhalts eines Elements haben, und so muss man den String selbst zusammen basteln.

    Richtig ist also:
    function contents($parser, $data) {
      if(...)
        $inhalt .= $data;
      // Do something...
    }


    Sprich .= (statt nur = ) um den String zusammen zu setzen.

    Das habe ich nicht gewusst.
    Das Problem ist also gelöst :)

    Danke,
    Sincer
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!