Latin-1 und die Unicode-Factory in Python

Ich besitze ein Python 2.6-Skript, das Sonderzeichen verschlüsselt, die in Latin-1 codiert sind und die ich aus einer SQL Server-Datenbank abrufe. Ich möchte diese Zeichen drucken, bin aber etwas eingeschränkt, weil ich eine Bibliothek verwende, die die aufruftunicode und ich weiß nicht, wie ich Python dazu bringen soll, einen anderen Codec als zu verwendenascii.

Das Skript ist ein einfaches Tool, um Suchdaten aus einer Datenbank zurückzugeben, ohne die SQL direkt in einem SQL-Editor ausführen zu müssen. Ich verwende dasPrettyTable 0,5 Bibliothek, um die Ergebnisse anzuzeigen.

Der Kern des Skripts ist dieses Stück Code. Die Tupel, die ich vom Cursor bekomme, enthalten Integer- und String-Daten und keine Unicode-Daten. (Ich würde verwendenadodbapi anstattpyodbc, was mir Unicode bringen würde, aberadodbapi gibt mir andere probleme.)

x = pyodbc.connect(cxnstring)
r = x.cursor()
r.execute(sql)

t = PrettyTable(columns)
for rec in r:
    t.add_row(rec)
r.close()
x.close()

t.set_field_align("ID", 'r')
t.set_field_align("Name", 'l')
print t

Aber dieName Die Spalte kann Zeichen enthalten, die außerhalb des ASCII-Bereichs liegen. Manchmal erhalte ich in Zeile 222 von eine solche Fehlermeldungprettytable.pyc, wenn es um die gehtt.add_row Anruf:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 12: ordinal not in range(128)

Dies ist Linie 222 inprettytable.py. Es verwendetunicode, das ist die Quelle meiner Probleme, und zwar nicht nur in diesem Skript, sondern auch in anderen Python-Skripten, die ich geschrieben habe.

for i in range(0,len(row)):
    if len(unicode(row[i])) > self.widths[i]:   # This is line 222
        self.widths[i] = len(unicode(row[i]))

Bitte sag mir, was ich hier falsch mache. Wie kann ich machenunicode arbeiten ohne zu hackenprettytable.py oder eine der anderen Bibliotheken, die ich benutze? Gibt es überhaupt eine Möglichkeit, dies zu tun?

BEARBEITEN: Der Fehler tritt beim nicht aufprint Aussage, aber bei dert.add_row Anruf.

EDIT: Mit der Hilfe von Bastien Léonard habe ich die folgende Lösung gefunden. Es ist kein Allheilmittel, aber es funktioniert.

x = pyodbc.connect(cxnstring)
r = x.cursor()
r.execute(sql)

t = PrettyTable(columns)
for rec in r:
    urec = [s.decode('latin-1') if isinstance(s, str) else s for s in rec]
    t.add_row(urec)
r.close()
x.close()

t.set_field_align("ID", 'r')
t.set_field_align("Name", 'l')
print t.get_string().encode('latin-1')

Es endete damit, dass ich auf dem Weg rein und raus entschlüsseln musste. All dies macht mich hoffnungsvoll, dass alle ihre Bibliotheken früher als später auf Python 3.x portieren!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage