Hallo!
Ich versuche gerade Umlaute und Sonderzeichen in meine SQLite-Datenbank einzuspeisen, was aber kläglich scheitert
Dazu muss ich noch sagen, dass ich mich mit UTF-8, usw. so garnicht auskenne, und noch nie etwas auf diesem Gebiet gemacht habe.
Ich habe schonmal im Intenet gesucht und habe folgenen Forum-Eintrag entdeckt: http://www.python-forum.de/viewtopic.php?p=104590.
Ich glaube das ist ungefähr das, was ich suche.
Leider habe ich keine Ahnung, wie ich das anwende :K
Ich würde mich also sehr über Tipps freuen!
akhof
NACHTRAG: Ich verwende übrigens SQLite3
SQLite Sonderzeichen UTF-8
@akhof: Der Beitrag den Du verlinkst bezieht sich auf ein ganz konkretes Problem mit der Software Trac wo Daten unterschiedlich kodiert in der Datenbank gelandet sind. Hast Du wirklich *das* Problem?
Was heisst denn überhaupt „kläglich gescheitert”? Was hast Du genau gemacht, was ist genau passiert, welchen Fehler gibt das genau oder in wie fern weicht das von dem ab was Du erwartet hast? Ohne diese Informationen ist alles was man konkret sagen kann, dass Du halt irgend etwas falsch machst.
Wenn Du mit Text arbeitest, solltest Du Unicode verwenden. Lektüre dazu ist zum Beispiel „Von Umlauten, Unicode und Encodings” im Wiki, oder die Python Unicode-FAQ.
Was heisst denn überhaupt „kläglich gescheitert”? Was hast Du genau gemacht, was ist genau passiert, welchen Fehler gibt das genau oder in wie fern weicht das von dem ab was Du erwartet hast? Ohne diese Informationen ist alles was man konkret sagen kann, dass Du halt irgend etwas falsch machst.
Wenn Du mit Text arbeitest, solltest Du Unicode verwenden. Lektüre dazu ist zum Beispiel „Von Umlauten, Unicode und Encodings” im Wiki, oder die Python Unicode-FAQ.
Danke ersteinmal für die schnelle Antwort!
Die Fehlermeldung lautet:
Ich habe folgendes probiert:
bzw.
Beides gibt die oben stehende Fehlermeldung zurück
akhof
Nachtrag: in frage steht z.B. "ü"
Die Fehlermeldung lautet:
Code: Alles auswählen
'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)
Code: Alles auswählen
frage = str(frage).decode("utf-8")
Code: Alles auswählen
frage = str(frage).decode("iso-8859-1")
akhof
Nachtrag: in frage steht z.B. "ü"
Wie ist denn frage definiert? Als unicode-literal, also mit einem fuehrenden u""?
Wenn ja, dann ist dein code da voellig sinnlos - denn mit str(frage) erzwingst du eine enkodierung von unicode zu einem byte-string - und da du keine angabe machst welches encoding dabei verwandt werden soll, fliegt das natuerlich.
danach willst du das ganze dann aber gleich wieder dekodieren - das ist dann ja voellig sinnlos, denn du hattest ja schon unicode zu beginn...
wie gesagt, das gilt nur fuer die annahme, das frage ein unicode-literal ist.
Wenn ja, dann ist dein code da voellig sinnlos - denn mit str(frage) erzwingst du eine enkodierung von unicode zu einem byte-string - und da du keine angabe machst welches encoding dabei verwandt werden soll, fliegt das natuerlich.
danach willst du das ganze dann aber gleich wieder dekodieren - das ist dann ja voellig sinnlos, denn du hattest ja schon unicode zu beginn...
wie gesagt, das gilt nur fuer die annahme, das frage ein unicode-literal ist.
Die Variable ist ein String; ohne ein "u"-davor - das meintest Du doch, oder?
Aber anscheinend klappt es mit nem unicode auch nicht, oder?
denn: gibt ja auch einen Fehler zurücl...
Aber anscheinend klappt es mit nem unicode auch nicht, oder?
denn:
Code: Alles auswählen
unicode("ä")
@akhof: Welche Python-Version? Wenn es Python 3.x ist, dann bleibt es dabei was deets gesagt hat. Bei Python 2.x kann an der Stelle diese Ausnahme nicht kommen wenn `frage` an etwas vom Typ `str` gebunden ist.
Zeige doch mal ein minimal lauffähiges Beispiel, das dieses Problem aufweist. Und komplette Tracebacks, damit man nicht raten muss wo genau das Problem auftritt.
Edit: ``unicode('ä')`` ergibt aber eine *andere* Ausnahme! Bitte genau darauf achten welche Operation durchgeführt werden soll und welche Ausnahme kommt. ``encode`` und ``decode`` sind zwei unterschiedliche Richtungen!
Zeige doch mal ein minimal lauffähiges Beispiel, das dieses Problem aufweist. Und komplette Tracebacks, damit man nicht raten muss wo genau das Problem auftritt.
Edit: ``unicode('ä')`` ergibt aber eine *andere* Ausnahme! Bitte genau darauf achten welche Operation durchgeführt werden soll und welche Ausnahme kommt. ``encode`` und ``decode`` sind zwei unterschiedliche Richtungen!
Ich benutze in diesem Fall (weil die GUI mit wxPython läuft) noch mit Python 2.7.2
Hier also das Beispiel:
NACHTRAG: wenn Frage = "ä" ist, nimmt die Datenbank die Werte entweder nicht an, oder der Versuch mit "unicode" scheitert... (siehe oben: Fehlermeldung)
Ich hoffe Ihr könnt mir helfen...
Vielen Dank schoneinmal
akhof
Hier also das Beispiel:
Code: Alles auswählen
def write_db():
frage = text_input.GetValue() #type=str
##########################
##dann habe ich versucht:#
frage = unicode(frage)
##########################
conn = sqlite3.connect([...])
c = [...]
c.execute("INSERT INTO Eintraege VALUES({0})".format(frage))
write_db()
Ich hoffe Ihr könnt mir helfen...
Vielen Dank schoneinmal
akhof
woher weisst du, dass frage vom typ str ist? hast du dir das ausgeben lassen?
und man benutzt *NIEMALS* string-formatting, um SQL zu erzeugen! Denn dann beantworte ich deine "frage" mit "''); drop tables;" und die DB ist futsch. Bitte benutz die parametrisierte Form von cursor.execute- - da gibt es genug Beispiele & disukssionen hier im Forum und woanders.
und man benutzt *NIEMALS* string-formatting, um SQL zu erzeugen! Denn dann beantworte ich deine "frage" mit "''); drop tables;" und die DB ist futsch. Bitte benutz die parametrisierte Form von cursor.execute- - da gibt es genug Beispiele & disukssionen hier im Forum und woanders.
<type 'str'>
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Bitte setze doch mal die Hinweise um und gehe auch auf die von BlackJack angesprochenen Dinge ein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Vielleicht magste sie hier dennoch mal posten - ggf. freut sich ein später suchender dann auch über die Lösungakhof hat geschrieben:AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@akhof: Hast Du das mit dem Typ auch überprüft wenn die Eingabe etwas ausserhalb von ASCII enthält? Wie genau sieht denn dann der Inhalt aus? Die `repr()`-Form bitte, denn dann sieht man ohne irgendwelche Interpretationen was genau der Wert enthält. Ich vermute nämlich das *dann* nicht `str` sondern `unicode` geliefert wird.
Du musst Dich auf jeden Fall mal mit `unicode`, `str`, und Kodierungen auseinander setzen. Und nicht einfach nur ``unicode(frage)`` schreiben und hoffen das das schon irgendwie auf magische Weise funktioniert.
Du musst Dich auf jeden Fall mal mit `unicode`, `str`, und Kodierungen auseinander setzen. Und nicht einfach nur ``unicode(frage)`` schreiben und hoffen das das schon irgendwie auf magische Weise funktioniert.
Erm, das ist doch keine wirklich nutzbare Antwort. Und *VERSTANDEN* hast du das auch nicht, oder? Also wird es dir beim naechsten mal wieder um die Ohren fliegen. Bitte, lies ein tutorial zu unicode in Python durch - du wirst sonst immer nur von Problem zu Problem lavieren.