Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Umlaute nach PHP Update - zerstören SimpleXML DOM

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Umlaute nach PHP Update - zerstören SimpleXML DOM

    Hallo zusammen,

    ich bin derzeit damit beschäftigt eine Anmeldung für ein (Rollenspiel) Event zu erstellen.

    Die Daten sollen anschließend in ein XML Verpackt werden, das wir diese weiter aufarbeiten können.

    Dazu nutze ich unter anderem folgende Funktion:

    PHP-Code:
    function WerteStammdatenAus()
    {
        $spielerXml = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?><Spieler></Spieler>');
        $charaXml = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?><Charakter></Charakter>');
        foreach($_POST as $k=>$v) 
        {
            if(strpos($k,"Spieler")!==false)
            {
                if ( $v == "")
                    $v = " ";                
                $spielerXml->addChild(str_replace("Spieler", "",$k),  $v);
            }
            if(strpos($k,"Chara")!==false)
            {
                if ( $v == "")
                    $v = " ";
                $charaXml->addChild(str_replace("Chara", "",$k), $v);
            }
        }
        
        $xml = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?>'.'<Stammdaten></Stammdaten>');
        
        echo $spielerXml;
        sxml_append($xml, $spielerXml);
        sxml_append($xml, $charaXml);
        
        
        return  $xml->asXML();

    }
    Das ganze hat wunderbar funktioniert, bis ich vor etwa zwei Wochen von meinem Provider den Hinweis bekommen hab, das ich doch PHP Updaten soll.
    Mit einem Klick war das auch sofort erledigt. Allerdings zerstören nun Umlaute das XML das heißt:

    Wenn ich im Feld Spielername - "Käse" eingebe bekomme ich als XML nur noch

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Stammdaten><Spieler><vorname>K
    zurück.

    Also habe ich einiges versucht und bin immer wieder darüber gestoplert das Encoding soll man ändern. (Das war auch das Resultat der Board-Suche)

    Ich habe das Encoding sowohl im HTML-Header der index.php als auch in der action.php

    index.php:
    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <title>Charaktererstellung für's HOEX 2</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    ...
    action.php:
    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
     <html>
     <head>
     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <title>Charaktererstellung für's HOEX 3</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <script type="text/javascript" src="js/html5.js"></script>
    Wie auch in den Konstruktoren von SimpleXML angepasst.

    Als das ganze nicht fruchtete habe ich versucht die Umlaute zu escapen:

    PHP-Code:
    function WerteStammdatenAus()
    {
        $spielerXml = new SimpleXMLElement('<Spieler></Spieler>');
        $charaXml = new SimpleXMLElement('<Charakter></Charakter>');
        foreach($_POST as $k=>$v) 
        {
            if(strpos($k,"Spieler")!==false)
            {
                if ( $v == "")
                    $v = " ";
                $spielerXml->addChild(str_replace("Spieler", "",$k), htmlentities( $v));
            }
            if(strpos($k,"Chara")!==false)
            {
                if ( $v == "")
                    $v = " ";
                $charaXml->addChild(str_replace("Chara", "",$k), htmlentities($v));
            }
        }
        
        $xml = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?>'.'<Stammdaten></Stammdaten>');
        
        sxml_append($xml, $spielerXml);
        sxml_append($xml, $charaXml);
        
        
        return  $xml->asXML();

    }
    Das führt allerdings nicht dazu, das dann dort im XML ein HMTL-Escape für den Umlaut auftaucht, sondern der value einfach gelöscht wird.

    Ich hoffe mir kann jemand helfen.

    Vielen Dank,

    Tobias


  • #2
    Encoding für die Dateispeicherung überprüft?
    Warum macht man das heutzutage eigentlich immer noch ausserhalb von Unicode?!
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Der gesamte DOM befindet sich noch nirgends auf der Platte und liegt unvollständig im RAM. Daher verstehe ich nicht ganz was ich an dem "Encoding für die Dateispeicherung", drehen soll.

      Ich hab das Encoding gerade mal von ISO-8859-1 (UTF-8 ) auf ISO 10646 (Unicode). Um gestellt mit dem Ergebnis, dass SimpleXMLElement im Konstruktor schon mit dem Encoding nicht klar kommt.

      Edit: Nachtrag:

      Ich kenne mich mit Webservern nicht aus behandlet der den Arbeitsspeicher auch als Dateispeicherung?

      Vielen Dank für deinen Einwand.

      Kommentar


      • #4
        Ich hab das Encoding gerade mal von ISO-8859-1 (UTF-8 ) auf ISO 10646 (Unicode).
        ISO-8859-1 ist kein UTF-8 !!! Und generell ist ISO kein Unicode!
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Zitat von Arne Drews Beitrag anzeigen
          ISO-8859-1 ist kein UTF-8 !!! Und generell ist ISO kein Unicode!
          Ja entschuldige ich habe da wohl etwas durcheinander gebracht. Die ISO 10646 ist beinahe identisch mit Unicode.

          Nicht desto trotz würde meiner Meinung nach der Zeichensatz ISO-8859-1 für meine Anwendung dicke reichen.

          Hat noch jemand eine Ahnung warum ich SimpleXML so seltsam verhält?

          Kommentar


          • #6
            Von welcher Version auf welche PHP-Version wurde geupdatet?
            PHP-Klassen auf github

            Kommentar


            • #7
              Von 5.2 auf 5.5

              Sorry

              Kommentar


              • #8
                htmlentities
                Wie bei htmlspecialchars() kann über das optionale dritte Argument encoding die bei der Konvertierung zu verwendende Zeichenkodierung festgelegt werden. Standardwert ist ISO-8859-1 in PHP Versionen vor 5.4.0 und UTF-8 in PHP 5.4.0 und neuer. Auch wenn das Argument optional ist, wird dennoch empfohlen eine für den Code richtige Kodierung anzugeben.
                Du hast weniger Probleme wenn du komplett auf UTF-8 umstellst, wie schon empfohlen.

                LG jspit
                PHP-Klassen auf github

                Kommentar


                • #9
                  Habs jetzt vernünftig auf UTF8 gezogen. Danke jetzt funktioniert es

                  Kommentar

                  Lädt...
                  X