XML-Datei mit Sonderzeichen in UTF8 auswerten und anzeigen

  • Es ist ein viel diskutiertes Problem wo es schon unheimlich viele Beiträge für gibt. Aber beim besten Willen komme ich nicht darauf wo mein Fehler liegt.
    Ich habe eine XML-Datei auf einem Webserver, welche mit PHP erzeugt wird.
    Diese kann auch hier angesehen werden: Mittelalter-Zeitreise.de


    Im PHP-Script wird der Herader entsprechend für XML vorbereitet:


    PHP
    header("Content-type: text/xml"); // Übermittelt den Content-Type 
    header("Content-Disposition: attachment; filename=termine.xml"); // Übermittelt, was heruntergeladen werden soll


    Die XML-Datei selber wird mit UTF 8 deklariert


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


    Ich wandel dann im PHP-Script alle Sonderzeichen wie ä ö ü usw. in ein UTF8 fähiges Format um:


    "ä"=>"ä"
    "ö"=>"ö"
    "ü"=>"ü"


    Im Quellcode von Java lade ich mir dann die XML-Datei und möchte diese dann in einem TextView anzeigen......
    Habe den Quellcode mal ein wenig zusammengekürzt ;)



    Jetzt besteht aber das Problem das dieser String, wenn er Sonderzeichen enthält, ab dieser Stelle abgeschnitten wird (aufhört). Alle nachfolgenden Zeichen werden einfach verschluckt bzw. nicht mehr dargestellt.


    Ich komm aber ned drauf was ich da falsch mache. Die XML-Datei wird auch im Browser oder XML-Editor perfekt angezeigt und die Formatierung ist auch so wie sie eigentlich sein sollte.......
    Ich hoffe es kann mir jemand auf die Sprünge helfen. An dem Problem knabber ich schon seit Wochen und jedes mal wenn ich mich wieder dran setze komme ich zum gleichen Ergebnis. Eigentlich müsste es funktionieren, oder?!?

  • Verstehe nicht wenn dein XML File wirklich UTF8 ist warum da so komische Sonderzeichen drin stehen, da encodest du schon auf der PHP Seite falsch


    -> ä ist ein ä und warum bei dir &#xxxx


    ????


    is.setEncoding("ISO-8859-1");


    Was denn nun ISO oder UTF - jetzt musste dich entscheiden ...

  • Ich hab mir gerade mal den Output von der Seite angeschaut - die Umlaute kommen dort nicht als UTF-8 sondern als Zahlencodes - z.B. Köstlichkeiten.


    Damit gibt's leider Probleme, die Zeichen müssen entweder wirklich als UTF-8 codiert werden oder von dir in der App noch mal schnell auf UTF-8 zurückcodiert werden, bevor der Parse darüber stolpert...

  • Vielen Dank erst einmal für eure Hilfe...... Diese hat mich auf jeden Fall auf den richtigen Weg gebracht.


    Zur Auflösung des Problems geh ich einmal kurz durch worauf man achten sollte....


    Wichtig ist es bei Sonderzeichen nach Möglichkeit UTF-8 zu verwenden. Dieses ist ein quasi-Standard womit alle wichtigen Schriftarten problemlos dargestellt werden können.


    1) Im PHP-Script sollte der Header der auszugebenden Datei wie folgt festgelegt werden:

    PHP
    header("Content-type: text/xml"); // Übermittelt den Content-Type 
    header("Content-Disposition: attachment; filename=termine.xml"); // Übermittelt, was heruntergeladen werden soll


    2) Die Ausgabe für die XML-Datei sollte wie folgt mit UTF-8 deklariert werden

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


    3) Alle Strings welche man nun mit PHP erzeugt sollten mit der Funktion utf8_encode($STRING) versehen werden. Hiermit wird sichergestellt das die ausgegebenen Zeichen auch wirklich dem UTF-8 Standard entsprechen.


    WICHTIG!!! Sollten in der Datenbank oder im String Sonderzeichen vorhanden sein, welche im HTML-Code geschrieben wurden, müssen diese wieder in normale Zeichen umgewandelt werden.

    PHP
    $meinString = "Mein String mit ÄÖÜ und auch ä ö ü";
    $umwandeln = array(
    "ä"=>"ä",
    "ö"=>"ö",
    "ü"=>"ü",
    ...
    );
    
    
    echo utf8_encode ("<name>".strtr($meinString,$umwandeln)."</name>\n\r");


    4) Bei einlesen der Textdatei hatte ich im Anschluss beim Java-Quelltext keine Probleme mehr. Daher denke ich sollte man hier mit dem Format am wenigsten Schwierigkeiten haben
    Der Aufruf setEncoding() ist somit auch nicht notwendig (gewesen)


    Java
    URL url = new URL("http://www.mittelalter-zeitreise.de/android/termindetails.php?id=567");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder docb = dbf.newDocumentBuilder();
    InputSource is = new InputSource(url.openStream());
    //is.setEncoding("ISO-8859-1");
    doc = docb.parse(is);
    doc.getDocumentElement();
  • Hallo Colt,


    kannst du bitte auch noch mal testen, was passiert, wenn deine XML-Datei im Text die schönen Zeichen < & " enthält - die können einem nämlich später echt Ärger bereiten.


    Dann hast du einen schönen Text für die Tutorials zusammen! :*


    Dazu kann ich dann nämlich eine Ergänzung schreiben: bei mir war das Problem, dass ich an der Serverseite nichts machen konnte, aber wenigsten sauberes XHTML bekommen habe - die Umwandlung der Umlaute hab ich dann in der App gemacht.

  • Stimmt, das & Zeichen ist ebenfalls ein Problem. Genau so wie viele andere Sonderzeichen wie < > "oder ' ........
    Das Java-Script interpretiert in diesem Falle die Daten nicht und stürzt u.U. ab.


    Ich habe dieses einfach im PHP-Script durch ein "und" oder Leerzeichen ausgetauscht. Eigentlich wäre die Prüfung und Korrektur in Java die korrektere Art und Weise aber ich denke, wenn ich schon ein XML-File erstelle, sollte es auch korrekt sein. ;)


    In vielen Anleitungen im Netz steht drinne, dass man diese Sonderzeichen in HTML formatieren sollte (was ich am Anfang ja auch tat)
    XML-Interpreter stellen diese Daten dann auch wunderbar und fehlerfrei dar. Aber beim einlesen in Java führte das dann zu dem besagten Problem......


    Ich hoffe das diese detaillierten Informationen anderen später auch helfen wird.
    Leider findet man im Netz oft nur unvollständige oder verwirrende Anleitungen oder immer wieder nur Verlinkungen auf Anleitungen/Dokus die man aber vorher schon gelesen hat und trotzdem nicht schlau draus wurde.....

  • UTF und deine Sonderzeichencodierung sind trotzdem 2 paar verschiedene Schuhe, das eine hat mit dem anderen wenig zu tun.



    Du kannst deine Sonderzeichen unter PHP formatieren wie du es schon immer gemacht hast z.b. ö ect
    wenn du die dann an deine Android App schickst , kannst du Sie dort mit


    HTML.fromhtml in ein sauberen String Umwandeln bzw. im Textview anzeigen lassen.


    --------------


    Ganz wichtig ist halt nur das du die Codierung nicht wechselst -> ISO/UTF, ansonsten gibt das immer Kauderwelsch.


    ---------------
    Sonderzeichen wie & und <> sind ebenfalls kein Problem. Wenn du weisst das solche Sonderzeichen auftreten können dann speicherst du die Strings unter PHP einfach per URLencode ... in deiner AndroidApp nutzt du dann wieder Urldecode und alles ist schön.
    ----------


    Warum nutzt du deine eigene Umwandlungsfunktion und nicht die dafür vorgesehenen Routinen von PHP, soetwas führt nur zu neuen Fehlerquellen.


    html_entity_decode — Konvertiert alle benannten HTML-Zeichen in ihre entsprechenden
    Ursprungszeichen



    htmlentities — Wandelt alle geeigneten Zeichen in entsprechende HTML-Codes um







    der phil

  • Stimmt, html_entity_decode() wäre in dieser Hinsicht ideal.... hatt ich vollkommen vergessen ;)


    Das mit der HTML-Formatierung in einer XML-Datei führt aber dazu das das Sonderzeichen & ( für die Formatierung &uuml ; ) verwendet wird und dieses natürlich "verboten" ist.
    Formatierungen für Umlaute müssten mit dem entsprechenden Zahlencode geschrieben werden um eine korrekte XML-Datei zu erzeugen......
    Ä = &#196 ;
    Ö = &#214 ;


    Also wenn ich dich dann richtig verstehe sollte es funktionieren wenn man in der XML-Datei alle Sonderzeichen in ein HTML-Format umwandelt (egal ob korrekte oder inkorrekte XML-Datei) und anschließend in den DocumentBuilder schiebt.
    Und beim darstellen in den entsprechenden TextViews oder ähnlichem von HTML wieder auf (für Menschen) lesbare Zeichen umwandeln......


    Hätte natürlich dann den Vorteil das die Sonderzeichen dann auch 1:1 dargestellt werden und nicht wie jetzt von mir entfernt oder anderweitig dargestellt werden.....


    Oder muss ich die Textdatei vorher schon durchforsten und die HTML-Zeichen wieder in (für Menschen) lesbare Zeichen umwandeln......

  • Hmm das ganze hin und her konvertiere verwirrt mich immer mehr :)



    Im Grunde hast du doch jetzt alles schön UTF codiert und alles sieht schön aus. Das einzige Problem wären Sonderzeichen in deinem <Beschreibungs> Tag.


    Hast du schon probiert den ganzen XML Block für dieses Tag in
    <![CDATA[<Element>dieses Element wird nur als Zeichenfolge ausgegeben</Element>]]>


    zu packen ???


    CDATA sorgt dafür das der Block nicht geparst wird und gut ist, dann sparen wir uns auch jegliches
    Maskieren von Sonderzeichen per htmlentities.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!