Latin-1 y la fábrica de Unicode en Python

Tengo un script de Python 2.6 que está amordazado con caracteres especiales, codificados en Latin-1, que estoy recuperando de una base de datos de SQL Server. Me gustaría imprimir estos caracteres, pero estoy algo limitado porque estoy usando una biblioteca que llama alunicode y no sé cómo hacer que Python use un códec que no seaascii.

El script es una herramienta simple para devolver datos de búsqueda desde una base de datos sin tener que ejecutar el SQL directamente en un editor de SQL. Yo uso elPrettyTable Biblioteca de 0.5 para mostrar los resultados.

El núcleo del script es este bit de código. Las tuplas que obtengo del cursor contienen datos de enteros y cadenas, y no datos de Unicode. Yo usaríaadodbapi en lugar depyodbc, lo que me daría Unicode, peroadodbapi me da otros problemas.

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

Pero elName La columna puede contener caracteres que caen fuera del rango ASCII. A veces recibo un mensaje de error como este, en la línea 222 deprettytable.pyc, cuando llega a lat.add_row llamada:

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

Esta es la línea 222 enprettytable.py. Usaunicode, que es la fuente de mis problemas, y no solo en este script, sino en otros scripts de Python que he escrito.

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]))

Por favor, dime qué estoy haciendo mal aquí. Como puedo hacerunicode trabajar sin hackearprettytable.py ¿O alguna de las otras bibliotecas que uso? ¿Hay incluso una manera de hacer esto?

EDITAR: El error se produce no en elprint declaración, pero en elt.add_row llamada.

EDITAR: Con la ayuda de Bastien Léonard, se me ocurrió la siguiente solución. No es una panacea, pero funciona.

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')

Terminé teniendo que decodificar en el camino y codificar en el camino. ¡Todo esto me da la esperanza de que todo el mundo transfiera sus bibliotecas a Python 3.x más pronto que tarde!

Respuestas a la pregunta(3)

Su respuesta a la pregunta