/ / Error de Python Unicode. UnicodeEncodeError: el codec 'ascii' no puede codificar el carácter u'u4e3a '- python, unicode, encoding, utf-8, python-2.x

Error unicode de Python. UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u'u4e3a '- python, unicode, codificación, utf-8, python-2.x

Por lo tanto, tengo este código para recuperar la cadena JSON de url

url = "http://...."
response = urllib2.urlopen(rul)
string = response.read()
data = json.loads(string)

for x in data:
print x["foo"]

El problema es x["foo"], si intento imprimirlo como se ve arriba, me sale este error.

Advertencia: Valor de cadena incorrecto: "xE4xB8xBA Co ..." para la columna "descripción" en la fila 1

Si uso x["foo"].decode("utf-8") Me sale este error:

UnicodeEncodeError: el codec "ascii" no puede "t" codificar el carácter u "u4e3a" en la posición 0: ordinal no está dentro del rango (128)

Si lo intento encode("ascii", "ignore").decode("ascii") Entonces me sale este error.

x ["foo"]. encode ("ascii", "ignore"). decode ("ascii") AttributeError: el objeto "NoneType" no tiene ningún atributo "codificar"

Hay alguna manera de arreglar este problema?

Respuestas

2 para la respuesta № 1

x["foo"].decode("utf-8") Resultando en UnicodeEncodeError significa que x["foo"] es de tipo unicode. str.decode toma una str tipea y traduce a unicode tipo. Python 2 intenta ser útil aquí e intenta convertir implícitamente tu unicode a str para que puedas llamar decode en eso. Lo hace con sys.defaultencoding, cual es ascii, que no puede codificar todo Unicode, de ahí la excepción.

La solución aquí es eliminar el decode llamada - el valor ya está unicode.

Lea la presentación de Ned Batchelder - Unicode Pragmático - mejorará enormemente su comprensión de esto y ayudará a prevenir errores similares en el futuro.

Vale la pena señalar aquí que todo devuelto por json.load estarán unicode y no str.


Abordar la nueva pregunta después de las ediciones:

Cuando tú print, necesitas bytes - Unicode es un concepto abstracto. Necesita una asignación de la cadena abstracta de Unicode a bytes. En términos de Python, debe convertir su unicode oponerse a str. Puedes hacer esto llamando encode con una codificación que le dice cómo traducir de la cadena abstracta a bytes concretos. Generalmente quieres usar la codificación utf-8.

Esto debería funcionar:

print x["foo"].encode("utf-8")