UnicodeDecodeError: 'ascii' codec can't decode byte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

ich versuche gerade per HTML etwas in eine Datenbank zu schreiben, bekomme aber leider immer eiunen Fehler sobald es sich um spezielle Sonderzeichen handelt. Ich komme leider nicht drauf (auch durch längeres suchen), wie ich dieses Problem lösen kann...

Code: Alles auswählen

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 202: ordinal not in range(128)
Irgendwie muss ich es decode() [n], nur wie weiß ich nicht...

Meine HTML Datei ist in UTF-8 und auch so gekennzeichnet, auch die PHP-Datei ist in UTF-8...

Weiß jemand, wie ich das beheben kann oder hat jemand einen Tip?

Vielen Dank!
MfG
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Zeig uns doch mal den Code, mit dem du schreibst, dann können wir dir sagen, wo die Kodierung sinnvoll ist. Was heißt "per HTML in die Datenbank"?

Allgemein: Du übergibst Bytestrings, der DB-Adapter erwartet aber wohl Unicodestrings. Irgendwo muss also ein explizites .decode('utf-8') hinein, damit der DB-Adapter nicht implizit mit ASCII dekodiert.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Code: Alles auswählen

for one in range(0,5):
            monat = form.getvalue("monat_neu_" + str(one),"")
            jahr = form.getvalue("jahr_neu_" + str(one),"")
            kategorie = form.getvalue("kategorie_neu_" + str(one),"")
            wo = form.getvalue("wo_neu_" + str(one),"")
            was= form.getvalue("was_neu_" + str(one),"")
            preis = form.getvalue("preis_neu_" + str(one),"")
            
            if (wo != "" or was != "") and preis != "":
                query = connection.cursor()
                query.execute("""
    						INSERT INTO 
    							kurt_daten(
    								monat,
    								jahr,
    								preis,
    								wo,
    								was,
    								kategorie) 
    							VALUES('%s','%s','%s','%s','%s','%s')"""
                                %(monat,jahr,preis,wo,was,kategorie)
                            )
Das ganze soll jedes Mal 5 Einträge aus einem HTML-Formular speichern (habe es leider schlecht ausgedrückt mit "per HTML"^^)

Danke!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Erstmal solltest du die Werte nicht selbst in den Query-String einfügen, sondern das dem DB-Adapter überlassen -- siehe Doku zu execute().

Ich weiß nicht, was dein "form" für ein Typ ist, aber für am sinnvollsten hielte ich es, wenn du diesem direkt beibringst, seinen Input als UTF-8 zu behandeln und Unicode zurückzugeben.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Und wie bringe ich es dem form bei?^^
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Tut mir leid, meine Kristallkugel ist gerade beim Geologen, und für so viel Tee ist es mir schon zu spät...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sollte das eine Webanwendung sein und form ein FieldStorage, schau dich lieber nach Alternativen um. In der Low-Level Gegend wäre da Werkzeug, das intern Unicode verwendet. Damit hast du dann das Problem nicht.
TUFKAB – the user formerly known as blackbird
lunar

Und vielleicht noch gleich ein ORM verwenden, das SQL Statement in deinem Snippet lässt mich nämlich schlimmstmögliches bezüglich der Sicherheit deiner Webanwendung vermuten...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

die Sicherheit spielt hier keine Rolle, da es nur von mir benutzt wird... und in einer abgesicherten Umgebung ist...

#Nebenbei: Was lässt dich denn daran schlimmstes vermuten?

Dann werde ich mir wohl mal Werkzeug anschauen.

Danke!
BlackJack

Es könnte zum Beispiel jemand in eines der Felder im Formular so etwas eintragen: ``foo'; drop table kurt_daten; --``.

Aber selbst wenn niemand so böswillige Eingaben macht, kann es immer noch vorkommen, dass in den Daten Zeichen vorkommen an denen sich Deine Methode "verschluckt". Die Kategorie "Rock'n'Roll" oder der Name "O'Reilly" machen beispielsweise Ärger.

Was die Relevanz der Sicherheit angeht: Solche "privaten" Skripte werden nicht selten früher oder später doch von anderen benutzt oder dienen gar als Basis für "öffentliche" Webanwendungen. Wenn man es gleich richtig macht, fällt einem so etwas später nicht auf die Füsse.

Sind hier übrigens wirklich alle Eingaben in die Datenbank *Texte*!?

Warum heisst die Laufvariable `one`?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ja, es sind alles Texte...

x,y,z oder was anderes ist genauso sinnlos... mir ist einfach nichts besseres eingefallen...

Vielen Dank Black Jack,... ich habe gerade nach einer Anleitung für sichere Anwendung von MySQLdb gesucht und bin leider nicht fündig geworden. Hast du da vllt. was, wo es gut erklärt wird (Sprache ist egal en/de)...

Danke!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SchneiderWeisse hat geschrieben:Vielen Dank Black Jack,... ich habe gerade nach einer Anleitung für sichere Anwendung von MySQLdb gesucht und bin leider nicht fündig geworden.
[wiki]Parametrisierte SQL-Queries[/wiki]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

SchneiderWeisse hat geschrieben:die Sicherheit spielt hier keine Rolle, da es nur von mir benutzt wird... und in einer abgesicherten Umgebung ist...
Die konstante Ignoranz was dieses Thema angeht ist doch echt krass.
Ist es denn soooo schlimm, statt

Code: Alles auswählen

c.execute("..." % (parameter1, parameter2, parameter3))
dieses zu schreiben

Code: Alles auswählen

c.execute("...", (parameter1, parameter2, parameter3))
?
Sind kommata so teuer?
Wenn du schon PHP in Python programmieren musst, und absichtlich schlechte Programme schreiben willst, dann bau doch besser woanders ein Paar Sicherheitslücken ein um dein Ziel zu erreichen, und escape hier nur für die Usability; Wenn du schon "'; drop table kunden; --" vernachlässigen willst, Ok, aber vernachlässige doch wenigstens "O'Brien" nicht als möglichen Wert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Was soll das denn jetzt? Wer ignoriert denn die Tips? Ich habe doch deswegen noch extra nachgefragt und habe von Leonidas eine kurze, aber perfekte Antwort bekommen. Ein Python Programmierer fällt gewöhnlich nicht vom Himmel....

Vielen Dank für deinen Kommentar!
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

SchneiderWeisse hat geschrieben:Was soll das denn jetzt? Wer ignoriert denn die Tips?
Sorry, hab das etwas in den falschen Hals bekommen. Es gab hier im Forum mehrfach ziemlich ähnliche Diskussionen, die alle gemeinsam hatten, dass der Fragende nach einem Hinweis "Ich brauch keine Sicherheit" sagte (was für mich ziemlich nach Ignorieren klang)
Und das ist einfach ein Gerücht, selbst wenn man sie "noch nicht" braucht: die Fortranprogrammierer früher hätten sich auch nie gedacht, dass sie mal vierstellige Jahreszahlen brauchen.
Und selbst, wenn man sie wirklich nie braucht, so schafft man schlechte Bräuche, die dank google dann verbreitet werden.

Ich wollte auch nicht darüberherziehen, dass du nicht als Programmierergott startest, es sah eben nur etwas ignorant aus (weil es eben in der doku zur db-api steht). Wie gesagt, nicht übel nehmen, bitte.
Antworten