python - str - UnicodeDecodeError: el códec ''utf8'' no puede decodificar bytes en la posición 3-6: datos no válidos
unicode escape python (8)
¿Cómo funciona la cosa unicode en python2? Simplemente no entiendo.
aquí descargo datos de un servidor y los analizo para JSON.
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.egg/eventlet/hubs/poll.py", line 92, in wait
readers.get(fileno, noop).cb(fileno)
File "/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.egg/eventlet/greenthread.py", line 202, in main
result = function(*args, **kwargs)
File "android_suggest.py", line 60, in fetch
suggestions = suggest(chars)
File "android_suggest.py", line 28, in suggest
return [i[''s''] for i in json.loads(opener.open(''https://market.android.com/suggest/SuggRequest?json=1&query=''+s+''&hl=de&gl=DE'').read())]
File "/usr/lib/python2.6/json/__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.6/json/decoder.py", line 319, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.6/json/decoder.py", line 336, in raw_decode
obj, end = self._scanner.iterscan(s, **kw).next()
File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
rval, next_pos = action(m, context)
File "/usr/lib/python2.6/json/decoder.py", line 217, in JSONArray
value, end = iterscan(s, idx=end, context=context).next()
File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
rval, next_pos = action(m, context)
File "/usr/lib/python2.6/json/decoder.py", line 183, in JSONObject
value, end = iterscan(s, idx=end, context=context).next()
File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
rval, next_pos = action(m, context)
File "/usr/lib/python2.6/json/decoder.py", line 155, in JSONString
return scanstring(match.string, match.end(), encoding, strict)
UnicodeDecodeError: ''utf8'' codec can''t decode bytes in position 3-6: invalid data
¡¡gracias!!
EDITAR: la siguiente cadena provoca el error: ''[{"t":"q","s":"abh/xf6ren"}]''
. /xf6
debe decodificarse a ö
(abhören)
El error que está viendo significa que los datos que recibe del extremo remoto no son JSON válidos. JSON (de acuerdo con la especificación) es normalmente UTF-8, pero también puede ser UTF-16 o UTF-32 (en big-o little-endian). El error exacto que está viendo significa que una parte de los datos no era UTF-8 válido (y tampoco UTF-16 ni UTF-32, ya que producirían errores diferentes).
Quizás debería examinar la respuesta real que recibe del extremo remoto, en lugar de pasar ciegamente los datos a json.loads()
. En este momento, estás leyendo todos los datos de la respuesta en una cadena y asumiendo que es JSON. En cambio, verifique el tipo de contenido de la respuesta. Asegúrese de que la página web realmente pretende proporcionarle JSON y no, por ejemplo, un mensaje de error que no sea JSON.
(Además, después de verificar la respuesta, use json.load()
pasándole el objeto similar a un archivo devuelto por opener.open()
, en lugar de leer todos los datos en una cadena y pasarlos a json.loads()
.
En su android_suggest.py, rompa esa declaración monstruosa de retorno de una línea en piezas one_step_at_a_time. Registre repr(string_passed_to_json.loads)
algún lugar para que pueda verificarse después de que ocurra una excepción. Eye-ball los resultados. Si el problema no es evidente, edite su pregunta para mostrar la repr.
La cadena que intenta analizar como JSON no está codificada en UTF-8. Lo más probable es que esté codificado en ISO-8859-1. Pruebe lo siguiente:
json.loads(unicode(opener.open(...), "ISO-8859-1"))
Eso manejará cualquier diéresis que pueda aparecer en el mensaje JSON.
Debes leer Absoluto mínimo de Joel Spolsky, cada desarrollador de software Absolutamente, positivamente debe saber sobre Unicode y juegos de caracteres (¡Sin excusas!) . Espero que aclare algunos problemas que tienes con Unicode.
La solución para cambiar la codificación a Latin1 / ISO-8859-1 resuelve un problema que observé con html2text.py como se invoca en una salida de tex4ht. Lo uso para un recuento de palabras automatizado en documentos LaTeX: tex4ht los convierte a HTML, y luego html2text.py los elimina a texto puro para contarlos a través de wc -w. Ahora, si, por ejemplo, aparece un "Umlaut" alemán a través de una entrada en la base de datos de literatura, ese proceso fallaría ya que html2text.py se quejaría, por ejemplo:
UnicodeDecodeError: el códec ''utf8'' no puede decodificar bytes en la posición 32243-32245: datos no válidos
Ahora, estos errores serían más difíciles de rastrear y, en esencia, querría tener el diéresis en la sección de referencias. Un cambio simple dentro de html2text.py desde
data = data.decode (codificación)
a
data = data.decode ("ISO-8859-1")
resuelve ese problema; si llama a la secuencia de comandos utilizando el archivo HTML como primer parámetro, también puede pasar la codificación como segundo parámetro y ahorrar la modificación.
Mi solución es un poco graciosa. Nunca pensé que sería tan fácil como guardarlo con el códec UTF-8. Estoy usando Notepad ++ (v5.6.8). No me di cuenta de que lo guardé inicialmente con el códec ANSI. Estoy usando un archivo separado para colocar todo el diccionario localizado. Encontré mi solución en la pestaña ''Codificación'' de mi Notepad ++. Seleccioné ''Codificación en UTF-8 sin lista de materiales'' y la guardé. Funciona brillantemente
Pega esto en tu línea de comando:
export LC_CTYPE="en_US.UTF-8"
Solo en caso de que alguien tenga el mismo problema. YouCompleteMe usando vim con YouCompleteMe , no pude iniciar ycmd con este mensaje de error, lo que hice fue: export LC_CTYPE="en_US.UTF-8"
, el problema desapareció.
unicode(urllib2.urlopen(url).read(), ''utf8'')
temporal: unicode(urllib2.urlopen(url).read(), ''utf8'')
: esto debería funcionar si lo que se devuelve es UTF-8.
urlopen().read()
devuelve bytes y debe decodificarlos para cadenas unicode. También sería útil verificar el parche desde http://bugs.python.org/issue4733