Umlaute bei der Kommunikation mit einem SOAP Webservice

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Umlaute bei der Kommunikation mit einem SOAP Webservice

    Hallo zusammen,

    ich verzweifle gerade an einem - scheinbar - trivialen Problem:
    Meine iPad-App kommuniziert mit einem SOAP-Webservice, die nötigen Klassen habe ich mit SudzC erstellen lassen. Die Kommunikation mit dem Webservice funktioniert einwandfrei, ABER: Umlaute kommen nicht korrekt an. Über ein Web-Frontend kann ich die gesendeten Daten einsehen und statt der eigentlichen Umlaute enthalten die Strings die UTF8-Escapes der Zeichen...
    Also z.B. ö als \U00f6
    Das encoding ist auf UTF-8 gesetzt, das sollte eigentlich passen. Das übermittelte Datenobjekt erzeuge ich folgendermassen:

    Quellcode

    1. //postData ist ein NSString, der den kompletten SOAP-XML-Request enthält
    2. //request ist mein SoapRequest-Objekt, das den Request ausführt und die Daten sendet
    3. [request setHTTPBody: [postData dataUsingEncoding:NSUTF8StringEncoding]];


    Ich habe alles mir mehr oder weniger sinnvoll Erscheinende ausprobiert und weiß nicht mehr weiter... Vielleicht kann auch der doofe Webservice einfach nicht damit umgehen, aber momentan denke ich eher noch dass ich der Doofe bin ;)
    Hat jemand schon mal ein derartiges Problem gehabt und es vieleicht lösen können?

    Schon mal Danke und Grüße
    Thomas
  • Da ich keinen Einfluss auf den Webservice habe, möchte ich, dass meine App die Daten so versendet dass der Webservice sie versteht...

    Ich habe in der Zwischenzeit die Kommunikation mal über SoapUI getestet, damit sind auch Umlaute kein Problem. Also mache ich wohl beim Versenden bzw. Encoding der Daten einen Fehler...
  • Was meinst Du mit "Format"? Der Webservice erwartet Daten UTF8-codiert. Wenn ich die Requests mit SoapUI ausführe, werden die Umlaute korrekt übergeben. Es geht also wahrscheinlich darum, wie der Byte stream zusammengesetzt ist oder so was in der Richtung...
  • tomaso schrieb:

    Was meinst Du mit "Format"? Der Webservice erwartet Daten UTF8-codiert. Wenn ich die Requests mit SoapUI ausführe, werden die Umlaute korrekt übergeben. Es geht also wahrscheinlich darum, wie der Byte stream zusammengesetzt ist oder so was in der Richtung...

    Spannend. Wie kodiere ich Daten denn UTF8?
    Daten, speziell Bytestreams haben erst einmal überhaupt gar keine Kodierung. Sie haben einfach nur Bytes.
    UTF8 ist eine Zeichencodierung. Oder hast du jemals etwas von einem UTF8 kodiertem PNG gehört?

    SoapUI ist ja gut und schön. Nur sagt die Funktionalität eines Treckers auf dem Acker nichts über das Fahrverhalten eines Sportwagens auf eben selbigem aus.

    Bist du schon einmal darauf gekommen, dir das NSData Objekt anzeigen zu lassen? Also den von dir sogenannten Bytestream?
    Wenn der dem UTF8-Encoding entspricht (und das wird er) liegt der Fehler ganz sicher nicht in den Daten.
    Überschreibt dein SOAP-Request vielleicht das Encoding? Oder irrst du dich am Ende gar und der Server bzw. das von dir genutzte Script kann gar kein UTF-8?

    UTF8 muss an mehreren Stellen definiert werden: in den Einstellungen des Servers, in der verwendeten Datenbank und auch das Dateiformat der Scripte muss UTF-8 sein.
    Vermutlich hakt es in diesem Fall daran, dass das aufgerufene Script irgendwas Anderes ist, nichts mit UTF8 anfangen kann und es deshalb in meinetwegen ISO 8859-15 umwandelt.
    Letzteres wird nämlich gern vergessen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ok, ok, Daten UTF8 zu kodieren ist natürlich Quatsch, da habe ich mich wohl falsch ausgedrückt, sorry. Wenn ich mir das Datenobjekt (wieder als String) über die Konsole ausgeben lasse, sehe ich dass die Umlaute escaped enthalten sind, siehe oben z.B. ö = \U00f6.
    Ich habe für dataUsingEncoding auch alle m.E. möglichen Alternativen ausprobiert (NSASCIIStringEncoding, NSISOLatin1StringEncoding, NSISOLatin2StringEncoding, ...) ausprobiert, die Umlaute werden aber immer mit der gleichen Escape-Sequenz dargestellt...?
  • Die Konsole kann kein UTF-8.

    Nimm -description von NSData.
    Der stellt dir hexadezimal die Bytes dar.
    Daran sollst du ablesen, ob es den UTF-8 Bytes entspricht.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Wie kommst du darauf, dass besagte Seite UTF8 kann?
    Der macht es richtig, allerdings nur für ein einzelnes Zeichen:
    ltg.ed.ac.uk/~richard/utf-8.cgi?input=00F6&mode=hex

    Ergo: irgend eine Schnittstelle deines Webservices kann kein UTF-8
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Zum Beispiel:
    web-sniffer.net/

    Bei deinem Beispiel:
    Content-Type: text/html; charset=utf-8

    Nehmen wir Google:
    Content-Type: text/html; charset=ISO-8859-1

    Damit siehst du also zumindest, ob dein Server ISO-8859-1 oder UTF-8 bevorzugt.

    Dass es dann immer noch Probleme mit dem Script geben kann, beispielsweise weil es nicht im UTF8-Format gespeichert ist, ist natürlich nicht auszuschließen.
    Da musst du dich dann an den Anbieter der Seite wenden.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Vielen Dank an Euch alle, die Lösung sieht folgendermaßen aus:
    Aus meinem Request-String erstelle ich über CFStringCreateFromExternalRepresentation einen ASCII C String, der keine escaped Chars enthält und den packe ich dann wiederum UTF8 codiert in mein NSData-Objekt...

    Quellcode

    1. NSString *postd = (NSString *)CFStringCreateFromExternalRepresentation(NULL, (CFDataRef)[postData dataUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingNonLossyASCII);
    2. NSData *data = [[[NSData alloc] initWithData:[postd dataUsingEncoding:NSUTF8StringEncoding]] autorelease];


    Das funktioniert!