2012-05-12 19 views
87

Estoy teniendo algunos problemas al intentar codificar una cadena en UTF-8. He intentado muchas cosas, incluyendo el uso string.encode('utf-8') y unicode(string), pero me sale el error:UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xef en la posición 1

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

Ésta es mi cadena:

(。・ω・。)ノ 

no veo lo que va mal, alguna idea?

Editar: El problema es que la impresión de la cadena tal como está no se muestra correctamente. Además, este error cuando trato de convertirlo:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' 
>>> s1 = s.decode('utf-8') 
>>> print s1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) 
+0

Es una cadena normalmente insertada. Lo mismo ocurre cuando intento imprimirlo. – Markum

+0

me encuentro con el mismo cuando PIP instalar y fijar de aquí: [instalar algún devel] [1] [1]: http://stackoverflow.com/questions/17931726/ascii-codec-cant -decode-error-when-use-pip-to-install-uwsgi – BollMose

Respuesta

67

Esto tiene que ver con la codificación de su terminal no configurado en UTF-8. Aquí está mi terminal

$ echo $LANG 
en_GB.UTF-8 
$ python 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' 
>>> s1 = s.decode('utf-8') 
>>> print s1 
(。・ω・。)ノ 
>>> 

En mi terminal del ejemplo funciona con lo anterior, pero si me deshago de la LANG establecer entonces no va a trabajar

$ unset LANG 
$ python 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' 
>>> s1 = s.decode('utf-8') 
>>> print s1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) 
>>> 

consulte la documentación para su variante de Linux para descubrir cómo hacer que este cambio sea permanente.

+1

Las configuraciones faltantes también podrían ser una razón. Para instalarlos, ejecute 'sudo apt-get install language-pack-de' o' sudo locale-gen de_DE.UTF-8' (para configuraciones regionales en alemán). – Non

22

intento:

string.decode('utf-8') # or: 
unicode(string, 'utf-8') 

edición:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') da u'(\uff61\uff65\u03c9\uff65\uff61)\uff89', lo cual es correcto.

por lo que su problema tiene que ser en algún lugar oter, posiblemente, si intenta hacer algo con él estaban existe una conversión implícita pasando (se podría imprimir, escribir en una corriente ...)

decirlo más necesitaremos ver algún código.

+0

Ambos devuelven 'UnicodeEncodeError: 'charmap' códec no puede codificar caracteres en la posición 1-5: mapas de caracteres a ' – Markum

+0

por favor publicar 'repr (cadena) ' – mata

+0

' '(\ xef \ xbd \ xa1 \ xef \ xbd \ xa5 \ xcf \ x89 \ xef \ xbd \ xa5 \ xef \ xbd \ xa1) \ xef \ xbe \ x89'' – Markum

1

Parece que su cadena está codificada en utf-8, ¿cuál es exactamente el problema? ¿O qué estás tratando de hacer aquí ...?

Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' 
>>> s1 = s.decode('utf-8') 
>>> print s1 
(。・ω・。)ノ 
>>> s2 = u'(。・ω・。)ノ' 
>>> s2 == s1 
True 
>>> s2 
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89' 
+0

Imprimiendo la cadena original como se muestra '('¢ í'¢ Ѥë' ¢ Ñ'¢ í)' ¥ ', quiero que se codifique correctamente. – Markum

20

Mi +1 al comentario de mata al https://stackoverflow.com/a/10561979/1346705 ya la demostración de Nick Craig-Wood. Usted ha decodificado la cadena correctamente. El problema es con el comando print, ya que convierte la cadena Unicode en la codificación de la consola y la consola no puede mostrar la cadena. Intenta escribir la cadena en un archivo y ver el resultado utilizando algún editor decente que es compatible con Unicode:

import codecs 

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' 
s1 = s.decode('utf-8') 
f = codecs.open('out.txt', 'w', encoding='utf-8') 
f.write(s1) 
f.close() 

A continuación podrá ver (。・ω・。)ノ.

4

No hay problemas con mi terminal. Las respuestas anteriores me ayudaron mirando en la dirección correcta, pero no funcionó para mí hasta que añadí 'ignore':

fix_encoding = lambda s: s.decode('utf8', 'ignore') 

Como se indica en el comentario anterior, esto puede conducir a resultados no deseados. OTOH también puede hacer el truco lo suficientemente bien para que las cosas funcionen y no te importa perder algunos personajes.

+2

Esto está mal, estás forzando a que la función de codificación lambda ignore la codificación, lo que significa que estás perdiendo caracteres. –

+2

Esto resolvió mi problema, donde no sabía la codificación original y no me importaba perder algunos personajes. – Edhowler

-2

i resolver ese problema cambiando en el settings.py archivo con 'motor': 'django.db.backends.mysql', ¡No uso 'motor': 'mysql.connector.django',

+0

@rayryeng ¿Podría explicar el motivo de su edición? Parece cambiar completamente el significado de lo que escribió el OP, desde recomendar una configuración particular hasta recomendar ** contra **. –

+0

@AndrewMedico - Mis disculpas. Vi que esta publicación era muy similar a otra, así que creí que eran lo mismo. Regresaré. – rayryeng

7

Si está trabajando en un host remoto host, mire /etc/ssh/ssh_config en su local PC.

Cuando este archivo contiene una línea:

SendEnv LANG LC_* 

comentario a cabo con la adición de # a la cabeza de la línea. Podría ayudar.

Con esta línea, ssh envía las variables de entorno relacionadas con el lenguaje de su PC al host remoto . Causa muchos problemas.

-2

Simplemente convierta el texto explícitamente en una cadena usando str(). Trabajó para mi.

0

Me estaba dando el mismo tipo de error, y encontré que la consola no es capaz de mostrar la cadena en otro idioma. Por lo tanto, hice los cambios de código a continuación para establecer default_charset como UTF-8.

data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')] 
default_charset = 'UTF-8' #can also try 'ascii' or other unicode type 
print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ]) 
1

esto funciona para Ubuntu 15.10:

sudo locale-gen "en_US.UTF-8" 
sudo dpkg-reconfigure locales 
1

En mi caso, fue causado por mi archivo Unicode que se guarda con una "BOM". Para resolver esto, abrí el archivo usando BBEdit e hice un "Guardar como ..." eligiendo para codificar "Unicode (UTF-8)" y no con lo que vino con lo que era "Unicode (UTF-8, con lista de materiales) "

+0

Esto funcionó para mí. –

1

Intente configurar la codificación predeterminada del sistema como utf-8 al inicio del script, de modo que todas las cadenas estén codificadas con eso.

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
Cuestiones relacionadas