UnicodeDecodeError: 'utf-8' codec

Hola
Estoy haciendo unas pruebas en la distro kde neon con python
y cuando hago una consulta que incluye caracteres como la ñ
me sale el siguiente error:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd1 in position 7: invalid continuation byte

Si la consulta no devuelve algun nombre con ese caracter, todo sale bien.

podria ser algo del sistema operativo o se puede resolver desde python

La consulta esta obteniendo bytes en algun encoding que no es utf-8, en alguna parte hay una conversion a str con el encoding equivocado

Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "tribilìn"
>>> as_bytes = s.encode("latin1")
>>> z = as_bytes.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xec in position 6: invalid
continuation byte
>>> as_bytes.decode("latin1")
'tribilìn'

Para resolverlo hay que averiguar cual seria el encoding usado para almacenar los datos y ver de aplicarlo.

La recomendacion usual es que el grueso del codigo trabaje texto, o sea str y hacer conversion a-desde bytes justo cuando haces IO

hola
gracias por responder
el codigo es de prueba, porque el windows no da error, aunque cambia el resultado de por ejemplo juan peña por juan pe?a.

Este error y que se detenga la ejecucion solo lo da en linux.
El encoding que tiene la base de datos es ISO8859_1

cur = con.cursor()

cur.execute( "select first 13 csid, clientes, telefono from acmsub order by csid ")

row = cur.fetchall()

for csid in row:

print(csid)

ese es basicamente el codigo de prueba, donde se pide los valores en la consulta sql.

que tal si usas
for csid in row:
print(csid.decode(“iso-8859-1”))

si no funca peqá el traceback completo.

Traceback (most recent call last):
File “/home/neon/Downloads/prueba_firebird1.py”, line 15, in
row = cur.fetchall()
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 3807, in fetchall
return [row for row in self]
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 3807, in
return [row for row in self]
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 3542, in next
row = self.fetchone()
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 3759, in fetchone
return self._ps._fetchone()
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 3412, in _fetchone
return self.__xsqlda2tuple(self._out_sqlda)
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 2730, in __xsqlda2tuple
value = b2u(value, self.__python_charset)
File “/usr/local/lib/python3.8/dist-packages/fdb/fbcore.py”, line 486, in b2u
return st.decode(charset)
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd1 in position 7: invalid continuation byte

ese es el traceback de la consulta donde da el error

y este otro es el traceback si pongo lo del decode en el print en la consulta que sale bien con el print sin el decode

Traceback (most recent call last):
File “/home/neon/Downloads/prueba_firebird1.py”, line 20, in
print(csid.decode(‘iso-8859-1’))
AttributeError: ‘tuple’ object has no attribute ‘decode’

ok, el problema no esta en el print.

Mirando la pagina de pypi para fdb, dice
"…

  • Automatic data conversion from strings on input.
  • Automatic input/output conversions of textual data between UNICODE and database character sets.

"

Mirando el ejemplo 2 de la doc de fdb en https://fdb.readthedocs.io/en/v2.0/getting-started.html#connecting-to-a-database


con = fdb.connect(
dsn=‘bison:/temp/test.db’,
user=‘sysdba’, password=‘pass’,
dialect=1, # necessary for all dialect 1 databases
charset=‘UTF8’ # specify a character set for the connection
)


yo probaria a ajustar el param ‘charset’

1 me gusta

funciona perfecto poniendo charset=‘ISO8859_1’ dentro los parametros de la conexion a la base de datos.

Gracias ccanepa por toda su ayuda