La decodificación de Python Unicode no es compatible

81

Tengo un problema con mi codificación en Python. He probado diferentes métodos, pero parece que no puedo encontrar la mejor manera de codificar mi salida en UTF-8.

Esto es lo que estoy tratando de hacer:

result = unicode(google.searchGoogle(param), "utf-8").encode("utf-8")

searchGoogledevuelve el primer resultado de Google para param.

Este es el error que obtengo:

exceptions.TypeError: decoding Unicode is not supported

¿Alguien sabe cómo puedo hacer que Python codifique mi salida en UTF-8 para evitar este error?

Simonbs
fuente

Respuestas:

102

Parece que google.searchGoogle(param)ya regresa unicode:

>>> unicode(u'foo', 'utf-8')

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    unicode(u'foo', 'utf-8')
TypeError: decoding Unicode is not supported

Entonces lo que quieres es:

result = google.searchGoogle(param).encode("utf-8")

Como nota al margen, su código espera que devuelva una utf-8cadena codificada, entonces, ¿qué sentido tenía decodificarla (usar unicode()) y volver a codificar (usar .encode()) usando la misma codificación?

yak
fuente
4
Honestamente, unicode()estaba jugando tratando de entender lo que estaba sucediendo. Muchas gracias :-)
simonbs
2
Ahora a veces lo conseguiré ascii' codec can't decode byte 0xc3 in position. ¿Sabes por qué es eso?
Simonbs
2
¿En la línea que sugerí? Entonces significaría que searchGoogle () devolvió una cadena con 0xC3 byte. Llamar .encode()a eso da como resultado que Python intente convertir a Unicode primero (usando codificación ascii). No sé por qué searchGoogle () a veces devuelve unicode y, a veces, una cadena. ¿Quizás depende de lo que le entregues param? Intente ceñirse a un tipo.
yak
65
Ojalá hubiera una forma segura y sencilla de convertir a Unicode.
Eric Walker
@EricWalker Podría escribir una función auxiliar incómoda como la def uors2u(object, encoding=..., errors=...)que devolverá el objectparámetro sin cambios si ya está en Unicode o lo convertirá si str. Sin embargo, este código huele mal. Debería convertir todas las entradas a Unicode tan pronto como las reciba desde el exterior (como un sistema de archivos) y convertirlas de nuevo si es necesario antes de devolverlas. Debería haber un solo lugar donde convertir str a Unicode, por lo que no debería ser necesaria una función auxiliar como la que describí.
Leonid