Seite 1 von 1

'ascii' codec can't encode character u'\xe4

Verfasst: Samstag 10. Mai 2014, 21:45
von audacity363
Guten Abend,
Bin gerade dabei einen kleinen Server für eine Android App zu schreiben, der SQL Querry für sie ausführt und die Ergebnisse zurückgibt.
Jetzt befinden sich aber in der Datenbank Umlaute und diese sollen natürlich auch mit übertragen werden.
Ausgeben über Print ist das auch kein Problem, aber sobald ich die Daten aufbereite kommt der Fehler:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)
Ich bereite die Daten wie folgt für die App auf:

Code: Alles auswählen

c.execute("select * from allgemeine_infos where vorname = %s and nachname = %s order by allgemeine_infos.id", (vorname, nachname,))
db_tmp = c.fetchall()
antwort = ""
for i in db_tmp:
        antwort += str(i["id"]) + ","
        antwort += None2Str(i["vorname"]) + ","
        antwort += None2Str(i["nachname"]) + ","
        antwort += None2Str(i["geschlecht"]) + ","
        antwort += None2Str(i["geburtstag"]) + ","
        antwort += None2Str(i["geburts_jahr"]) + "."
conn.send(antwort)
Leider ist beim kopieren die Formatierung flöten gegangen. Habe versucht sie so gut wie möglich wieder hinzubekommen.
None2Str gibt einfach ein Leerzeichen zurück wenn der Inhalt None ist.

Rufe die Datenbank auch schon mit "charset=''utf8" auf:

Code: Alles auswählen

db = MySQLdb.connect(host='blablabla.de',
                     db='datenbank',
                     user='user',
                     passwd='12345',
                     charset='utf8',
                     cursorclass=MySQLdb.cursors.DictCursor
                     )
Habe es auch schon mit:

Code: Alles auswählen

.decode("UTF-8")
und
.decode("iso-8859-1")
versucht und der Header " # -*- coding: utf-8 -*- " ist natürlich auch vorhanden.

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Samstag 10. Mai 2014, 22:59
von BlackJack
@audacity363: Versuchen reicht nicht, Du musst heraus finden wo die Ausnahme auftritt und verstehen *warum*.

Was denkst Du hat `antwort` in Zeile 11 für einen Wert und Typ, und was *müsste* der Wert dort für einen Typ haben?

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 08:05
von Sirius3
@audacity363: Warum erfindest Du ein Datenformat, wenn es schon fertige gibt? Was passiert, wenn in einem Feld ein Punkt oder Komma steht?

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 08:23
von audacity363
Sirius3 hat geschrieben:@audacity363: Warum erfindest Du ein Datenformat, wenn es schon fertige gibt? Was passiert, wenn in einem Feld ein Punkt oder Komma steht?
Was meinst du mit erfndest? Fasse doch nur die Ergebniss zusammen und trenne die einzelnen Felder mit "," und ein Ende des Datensatzes wird mit einem "." makiert.
Beim Insert wird aufgepasst, dass soetwas nicht pasiert.
BlackJack hat geschrieben:Was denkst Du hat `antwort` in Zeile 11 für einen Wert und Typ, und was *müsste* der Wert dort für einen Typ haben?
Wert: Es stehen alle gefunden Datenwerte drinnen und jeder Datensatz ist mit einem "." getrennt.
Typ: Str
Sollte: Str

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 08:32
von Sirius3
Den Typ 'Str' gibt es nicht, und wäre er 'str' gäbe es den Fehler nicht.
Du definierst Dir einen Feldtrenner und ein Datensatzendezeichen. Damit hast Du ein Datenformat erfunden. Und Deine App muß dann das Gegenteil vom Server machen, Datensätze nach Datensatzendezeichen und Felder nach Feldtrenner trennen.
Alles Arbeit, die man nicht hätte, wenn man eine Bibliothek für ein übliches Datenformat verwenden würde.

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 08:40
von audacity363
Sirius3 hat geschrieben:Den Typ 'Str' gibt es nicht, und wäre er 'str' gäbe es den Fehler nicht.
Du definierst Dir einen Feldtrenner und ein Datensatzendezeichen. Damit hast Du ein Datenformat erfunden. Und Deine App muß dann das Gegenteil vom Server machen, Datensätze nach Datensatzendezeichen und Felder nach Feldtrenner trennen.
Alles Arbeit, die man nicht hätte, wenn man eine Bibliothek für ein übliches Datenformat verwenden würde.
Ja sicher das mit dem Trennen war er Plan. Was soll ich denn deiner Meinung nach verwenden?

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 08:46
von Sirius3
JSON wird gerne genommen, weil es schon in der Standardbibliothek integriert ist:

Code: Alles auswählen

c.execute("select * from allgemeine_infos where vorname = %s and nachname = %s order by allgemeine_infos.id", (vorname, nachname,))
conn.sendall(json.dumps(c.fetchall()))

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 09:16
von BlackJack
@audacity363: Tja, muss und sollte sind falsch geraten. In welcher Weise falsch hängt davon ab ob Du Python 2 oder 3 einsetzt. Wenn es 2 ist hast Du `unicode` und solltest `str` haben, und bei 3 hast Du `str` und solltest `bytes` haben.

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 10:43
von audacity363
@Sirius3
Danke er überträgt es nun, nur kann Java nichts mit dem Tuple von Python anfangen. Für Java ist es nun ein plain String.

@BlackJack
Na ja okey aber soweit komme ich ja Nichtmal. Das Problem ist ja weiter oben.

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 10:50
von Sirius3
@audacity363: das Problem ist genau die `send`-Zeile, denn dort mußt Du festlegen, wie Zeichen übertragen werden.

Auch für Java gibt es Pakete, die JSON dekodieren können: JSONTokener

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 12:29
von Hyperion
Sirius3 hat geschrieben: Auch für Java gibt es Pakete, die JSON dekodieren können: JSONTokener
Gibts auch für XStream :-)

Re: 'ascii' codec can't encode character u'\xe4

Verfasst: Sonntag 11. Mai 2014, 13:56
von BlackJack
@audacity363: Wieso ist das Problem weiter oben? Der Traceback sollte von der `send()`-Zeile ausgelöst werden und nicht weiter oben. Ansonsten müsstest Du mal den Quelltext und den kompletten Traceback zeigen.