
Hallo,
seit den Chemnitzer Linuxtagen 2008 schaue ich mir Python genauer an. Jetzt habe ich ähnliche Probleme, wie im Thread "xml mit Umlauten parsen"
Aus der Firebird Datenbank, die mit dem "Characterset ISO8859_1" erstellt wurde, möchte ich strings mit Umlauten auslesen.
def list_Adr(self): dt_Adr = self.con.cursor() dt_Adr.execute("SELECT ID,KURZ FROM KO_ADR ORDER BY KURZ") rows = dt_Adr.fetchall() for row in rows: s = u"" s = "%3i %s" % (row[0], row[1])
#dass funktioniert, zeigt aber die Umlaute falsch an print s
#das bringt bei Umlauten einen Fehler print s.encode("ISO-8859-1")
199 Geb�udereinigung GmbH Traceback (most recent call last): File "./python/wnfDesktopkalender/wnf_fib.py", line 50, in <module> db.list_Adr() File "./python/wnfDesktopkalender/wnf_fib.py", line 41, in list_Adr print s.encode("ISO-8859-1") UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 14: ordinal not in range(128)
Was mache ich falsch?

Uwe Wilske schrieb:
rows = dt_Adr.fetchall() for row in rows: s = u"" s = "%3i %s" % (row[0], row[1])
Was soll denn das? Dir ist klar, das erste s hat mit den zweiten quasi nix zu tun. Wenn dann so:
s = u"%3i %s" % (row[0], row[1])
Wobei man sich besser erstmal row ansehen sollte. Du könntest sowas machen: print type(row[1]), repr(row[1])

Jens Diemer schrieb:
Uwe Wilske schrieb:
rows = dt_Adr.fetchall() for row in rows: s = u"" s = "%3i %s" % (row[0], row[1])
Was soll denn das? Dir ist klar, das erste s hat mit den zweiten quasi nix zu tun. Wenn dann so: s = u"%3i %s" % (row[0], row[1])
ja, das erkenne ich jetzt auch.
Wobei man sich besser erstmal row ansehen sollte. Du könntest sowas machen: print type(row[1]), repr(row[1])
<type 'str'> 'Geb\xe4udereinigung GmbH'
Aber wandeln kann ich jetzt mit
s = unicode("%3i %s" % (row[0], row[1]), 'iso-8859-1')

Hallo Uwe,
Am Dienstag, 18. März 2008 07:57:36 schrieb Uwe Wilske:
Hallo,
seit den Chemnitzer Linuxtagen 2008 schaue ich mir Python genauer an. Jetzt habe ich ähnliche Probleme, wie im Thread "xml mit Umlauten parsen"
Aus der Firebird Datenbank, die mit dem "Characterset ISO8859_1" erstellt wurde, möchte ich strings mit Umlauten auslesen.
def list_Adr(self): dt_Adr = self.con.cursor() dt_Adr.execute("SELECT ID,KURZ FROM KO_ADR ORDER BY KURZ") rows = dt_Adr.fetchall() for row in rows: s = u"" s = "%3i %s" % (row[0], row[1])
das verwandelt 's' nicht magischerweise in einen unicode string. Wenn du weisst, dass deine Datenbank iso-8859-1 kodierte Strings zurueckgibt, kannst du z.B. sowas machen: s = unicode("%3i %s" % (row[0], row[1]), 'iso-8859-1')
oder du schaust mal, ob deine db Anbindung dazu gebracht werden kann, gleich unicode zurueckzugeben.
#dass funktioniert, zeigt aber die Umlaute falsch an print s #das bringt bei Umlauten einen Fehler print s.encode("ISO-8859-1")
199 Geb�udereinigung GmbH Traceback (most recent call last): File "./python/wnfDesktopkalender/wnf_fib.py", line 50, in <module> db.list_Adr() File "./python/wnfDesktopkalender/wnf_fib.py", line 41, in list_Adr print s.encode("ISO-8859-1") UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 14: ordinal not in range(128)
Was mache ich falsch?

Hallo Stephan,
s = u"" s = "%3i %s" % (row[0], row[1])
das verwandelt 's' nicht magischerweise in einen unicode string.
Oh ja, das sehe ich jetzt auch
Wenn du weisst, dass deine Datenbank iso-8859-1 kodierte Strings zurueckgibt, kannst du z.B. sowas machen: s = unicode("%3i %s" % (row[0], row[1]), 'iso-8859-1')
ja so funktioniert es: 199 Gebäudereinigung GmbH
Danke für den Tipp.
oder du schaust mal, ob deine db Anbindung dazu gebracht werden kann, gleich unicode zurueckzugeben.
Das wäre nicht schlecht. Ich werde weiter suchen.
participants (3)
-
Jens Diemer
-
Stephan Diehl
-
Uwe Wilske