Kyrillisches Wort vom iPhone über Servlet in Datenbank eintragen

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

  • Kyrillisches Wort vom iPhone über Servlet in Datenbank eintragen

    Hallo zusammen,
    mein erster Beitrag, ich bin gespannt :) Vielleicht kann mir hier ja jemand helfen.

    Ich habe eine App geschrieben, bei der ich Wörter eingebe, und diese Wörter über ein Java-Servlet das auf einem Server im Internet läuft in eine Datenbank eintrage.
    Das klappt wunderbar mit normalen Wörtern, sobald ich aber das iPhone Keyboard auf z.B. russisch umschalte und ein Wort eingebe, landet in der Datenbank nicht mehr das Wort, sonder nur Fragezeichen. (??????????)

    Das meine mySQL Datenbank kein Kyrillisch versteht ist mir klar.
    Ich habe von einem Russen ein Wort in einer normalen Textdatei bekommen. Es ist das Wort: KUSS auf russisch.
    Bei ihm sieht das natürlich in der Textdatei russisch aus, da er auch den richtigen russischen Font auf seinem PC hat, denke ich.
    Bei mir sieht es aber so aus :ïîöåëóé
    Sind wohl jetzt reine Asciizeichen die ich so auch in der Datenbank eingeben könnte.

    Wenn ich jetzt aber das russische Wort für KUSS in der iPhone Tastatur eingebe, und es in meinem Programm kurz bevor ich es zu meiner Datenbank schicke, nochmal mit NSLog ausgeben lasse, dann Zeigt mir
    XCode das netterweise nur in russisch an. Sprich, Xcode kann wohl russisch :)
    Beim Senden zur Datenbank geht aber anscheinend alles verloren es kommen eben nur Fragezeichen an.

    Quellcode

    1. [data appendDate:[string dataUsingEncoding:NSUTF8StringEncoding]];


    In string steht bereits das russiche Wort für KUSS und wenn ich es mit NSLog ausgebe wird es auch in russisch in der Debug-Console ausgegeben.

    Als nächstes würde das ganze über NSMuteableURLRequest an ein Servlet geschickt wobei der String zusammen mit einigen weiteren Daten übertragen wird, was mit normalen Wörtern einwandfrei funktioniert.

    Quellcode

    1. [urlRequest setHttpBody:string];



    Was ich jetzt also eigentlich bräuchte wäre, kurz bevor ich das Wort vom iPhone zum Servlet schicke, eine Umwandlung des russischen Wortes in die selben Asciizeichen, wie ich sie auch in der Textdatei habe.
    Hat dazu jemand eine Idee oder einen anderen Vorschlag ?
    Die nächste Frage wäre dann, was passiert mit normalen Worten bei der Umwandlung. Bzw. kann ich irgendwie detecten ob ich das Wort umwandeln muss oder es so lassen kann wenn es eben nicht kyrillisch ist ?
  • Nelson schrieb:

    Das meine mySQL Datenbank kein Kyrillisch versteht ist mir klar.

    Hi,

    das mag Dir zwar klar sein, aber sofern Du keine steinalte Version am Laufen hast, liegst Du damit falsch.

    Nelson schrieb:

    Was ich jetzt also eigentlich bräuchte wäre, kurz bevor ich das Wort vom iPhone zum Servlet schicke, eine Umwandlung des russischen Wortes in die selben Asciizeichen, wie ich sie auch in der Textdatei habe.
    Hat dazu jemand eine Idee oder einen anderen Vorschlag ?
    Die nächste Frage wäre dann, was passiert mit normalen Worten bei der Umwandlung. Bzw. kann ich irgendwie detecten ob ich das Wort umwandeln muss oder es so lassen kann wenn es eben nicht kyrillisch ist ?

    Du brauchst keine Umwandlung, sondern einfach einen ganz normalen, simplen reinen UTF8-Datenfluss. Du erklärst MySQL, dass die Tabelle UTF-8 als Charset verwenden sollst, wählst ggf. die gewünschte Collation, bringst ggf. dem Servlet (einschl. der Verbindung des Servlets) bei, dass es um UTF-8 geht und fertig. Cocoa selbst hat ja eh keine Probleme mit Unicode.

    Carsten
  • UTF-8 zu verwenden ist schon mal eine gute Idee. Anscheinend hast Du in Deiner Übertragungskette aber einen Konvertierungs- oder nur Darstellungsfehler. Ein Darstellungsfehler würde nur einen Datenbank-Client betreffen, der Dir die Tabellenzeilen darstellt. Gehen wir also von einem Konvertierungsfehler aus. Die Konvertierungskette Deiner App sieht so aus:

    iPhone App -> HTTP-Request -> Servlet -> Datenbank

    Wenn aus kyrillischen Zeichen innerhalb dieser Kette Fragezeichen werden, bedeutet das meistens, dass Du 8-Bit-Sonderzeichen als UTF-8 einliest. Beispielsweise hat das Zeichen Ä den ISO-Latin-Code C4 (UTF-8: C3 84). Wenn Du das Byte 0xC4 aber mit einem UTF-8-Dekoder einliest, wandelt der das in Fragezeichen um.

    Du solltest mal in jeden Schritt eine Log-Ausgabe einbauen, die Dir möglichst auch die Binärdarstellung ausgibt.
    „Meine Komplikation hatte eine Komplikation.“
  • Hmmm, wenn es nur wirklich so einfach wäre...
    Habe mittlerweile den kompletten Weg überprüft soweit es mir möglich war, und komme zu dem Schluss, das bis zur Datenbank eigentlich alles korrekt übertragen wird.
    Hab mir auch meine mySQL Datenbank nochmal näher angesehen, und mittels mySQL Console und SHOW VARIABLES LIKE 'character_set_system'; die folgende Ausgabe bekommen: character_set_system | UTF8
    Damit sollte sie doch eigentlich UTF8 können.

    Nichts desto trotz, um wirklich auszuschliessen das das iPhone oder das Servlet doch das Problem verursachen, habe ich versucht ein UTF8 Wort direkt über phpMyAdmin einzutragen.
    Ich habe also ein russiches Wort von einer russischen Webseite mit copy paste in phpMyAdmin eingegeben. Es wird im entsprechenden Eingabe Feld [varChar (255)] auch noch russich angezeigt.

    Beim Abschicken kommt dann allerdings die Fehlermeldung:

    Quellcode

    1. 0 Zeile(n) betroffen.
    2. Warning: #1366 Incorrect string value:
    3. '\xD0\x92\xD0\xBB\xD0\xB0...' for column 'input' at row 1


    Diese String-schreibweise ist interessanterweise fast die gleiche wie wenn ich auf dem iPhone das eingegebene russische Wort vor dem Senden an die Datenbank wie folgt wandle:

    Quellcode

    1. newString = [myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


    Aber ich wollte ja erstmal iPhone und Servlet weglassen.
    Also hab ich dann versucht über die mySQL Console ein russisches Wort direkt per mySQL-Aufruf INSERT in die Datenbank einzutragen.

    Die Console zeigte zwar das russische Wort erst auch nur als Fragezeichen an, aber sobald man den Font der Console auf Lucida umstellt steht das richtige russische Wort da. Also werden die UTF8-codes wohl auch noch korrekt an die Datenbank gesendet. In der Datenbank selber wenn man sie dann mittels mySQL-Aufruf wieder ausliest, sieht man aber wieder nur die Fragezeichen, also ist das Wort doch nicht korrekt eingetragen worden.

    Somit müsste es also doch an der Datenbank liegen, aber was könnte man da noch umstellen ?
    Noch irgendwelche Ideen ?
  • So, jetzt läuft es.
    Zwei Sachen musste ich noch ändern damit es ging:
    Datenbank musste noch mal komplett neu angelegt werden damit sie vollständig auf UTF8 läuft.
    Änderungen per phpMyAdmin haben anscheinend nicht alles auf UTF8 gesetzt.
    Habe als collation utf8_general_ci gewählt.


    Zusätzlich musste aber noch im Java-Servlet der Datenbankaufruf wie folgt angepasst werden:

    Quellcode

    1. dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/servlet?useUnicode=true&characterEncoding=UTF8&autoReconnect=true", "username", "pw");


    Obwohl meine Logausgabe vom Servlet keine Fragezeichen auswarf, war es wohl doch kein richtiges UTF8 was das Servlet an die Datenbank sendete.
    Wie dem auch sei, nach den beiden Änderungen läuft alles einwandfrei.
  • Nelson schrieb:

    So, jetzt läuft es.
    Zwei Sachen musste ich noch ändern damit es ging:
    Datenbank musste noch mal komplett neu angelegt werden damit sie vollständig auf UTF8 läuft.
    Änderungen per phpMyAdmin haben anscheinend nicht alles auf UTF8 gesetzt.
    Habe als collation utf8_general_ci gewählt.


    Zusätzlich musste aber noch im Java-Servlet der Datenbankaufruf wie folgt angepasst werden:

    Quellcode

    1. dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/servlet?useUnicode=true&characterEncoding=UTF8&autoReconnect=true", "username", "pw");


    Obwohl meine Logausgabe vom Servlet keine Fragezeichen auswarf, war es wohl doch kein richtiges UTF8 was das Servlet an die Datenbank sendete.
    Wie dem auch sei, nach den beiden Änderungen läuft alles einwandfrei.


    die logausgabe kam wohl auch vor dem insert der daten!?