UnicodeDecodeError: el codec ‘ascii’ no puede decodificar el byte 0xef en la posición 1

Tengo algunos problemas al intentar codificar una cadena en UTF-8. He intentado varias cosas, incluido el uso de string.encode('utf-8') y unicode(string) , pero me sale el error:

UnicodeDecodeError: el codec ‘ascii’ no puede decodificar el byte 0xef en la posición 1: ordinal no está en el rango (128)

Esta es mi cadena:

 (。・ω・。)ノ 

No veo qué está mal, ¿alguna idea?

Edición: el problema es que imprimir la cadena como está no se muestra correctamente. Además, este error cuando bash 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 "", line 1, in  UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) 

Esto tiene que ver con que la encoding de su terminal no esté configurada en UTF-8. Aqui esta 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, el ejemplo funciona con lo anterior, pero si me deshago de la configuración LANG , no funcionará

 $ 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 "", line 1, in  UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) >>> 

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

tratar:

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

editar:

'(\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' , que es correcto.

por lo que su problema debe estar en algún otro lugar, posiblemente si intenta hacer algo con él si hay una conversión implícita en curso (podría estar imprimiendo, escribiendo en una secuencia …)

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

Mi +1 al comentario de mata en https://stackoverflow.com/a/10561979/1346705 y a la demostración de Nick Craig-Wood. Has decodificado la cadena correctamente. El problema está en el comando de print ya que convierte la cadena Unicode a la encoding de la consola, y la consola no es capaz de mostrar la cadena. Intente escribir la cadena en un archivo y observe el resultado utilizando un editor decente que admita 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() 

Luego verá (。・ω・。)ノ .

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

Cuando este archivo contiene una línea:

 SendEnv LANG LC_* 

coméntalo con la adición de # al principio de la línea. Podría ayudar.

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

Intente establecer la encoding predeterminada del sistema como utf-8 al inicio de la secuencia de comandos, de modo que todas las cadenas se codifiquen utilizando eso.

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

No hay problemas con mi terminal. Las respuestas anteriores me ayudaron a buscar las direcciones correctas, pero no funcionó hasta que agregué 'ignore' :

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

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

Está bien usar el siguiente código en la parte superior de su guión, como sugirió Andrei Krasutski .

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

Pero le sugeriré que también agregue # -*- coding: utf-8 -* line en la parte superior de la secuencia de comandos.

Omitirlo arroja un error por debajo de mi caso cuando bash ejecutar basic.py .

 $ python basic.py File "01_basic.py", line 14 SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 

El siguiente es el código presente en basic.py que arroja el error anterior.

código con error

 from pylatex import Document, Section, Subsection, Command, Package from pylatex.utils import italic, NoEscape import sys reload(sys) sys.setdefaultencoding('utf-8') def fill_document(doc): with doc.create(Section('ِش سثؤفهخى')): doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا') doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث')) with doc.create(Subsection('آثص ٍعلاسثؤفهخى')): doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}') if __name__ == '__main__': # Basic document doc = Document('basic') fill_document(doc) 

Luego agregué # -*- coding: utf-8 -*- línea en la parte superior y ejecutada. Funcionó.

código sin error

 # -*- coding: utf-8 -*- from pylatex import Document, Section, Subsection, Command, Package from pylatex.utils import italic, NoEscape import sys reload(sys) sys.setdefaultencoding('utf-8') def fill_document(doc): with doc.create(Section('ِش سثؤفهخى')): doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا') doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث')) with doc.create(Subsection('آثص ٍعلاسثؤفهخى')): doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}') if __name__ == '__main__': # Basic document doc = Document('basic') fill_document(doc) 

Gracias.

Parece que tu 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' 

esto funciona para ubuntu 15.10:

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

En mi caso, se debió a que mi archivo Unicode se guardó con una “lista de materiales”. Para resolver esto, abrí el archivo con BBEdit e hice un “Guardar como …” eligiendo para codificar “Unicode (UTF-8)” y no con lo que venía, que era “Unicode (UTF-8, con BOM) ”

Recibí el mismo tipo de error y descubrí que la consola no es capaz de mostrar la cadena en otro idioma. Por lo tanto, hice los siguientes cambios de código 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 ]) 

BOM, es tan a menudo BOM para mí

vi el archivo, use

 :set nobomb 

y guárdalo. Eso casi siempre lo arregla en mi caso.

Esta es la mejor respuesta: https://stackoverflow.com/a/4027726/2159089

en linux:

 export PYTHONIOENCODING=utf-8 

así que sys.stdout.encoding está bien.

Tuve el mismo error, con direcciones URL que contienen caracteres que no son ASCII (bytes con valores> 128)

 url = url.decode('utf8').encode('utf-8') 

Trabajé para mí, en Python 2.7, supongo que esta asignación cambió “algo” en la representación interna de str , es decir, fuerza la deencoding correcta de la secuencia de bytes respaldada en la url y finalmente pone la cadena en un utf-8 str con todos La magia en el lugar correcto. Unicode en Python es magia negra para mí. Esperanza útil

resuelvo ese problema cambiando en el archivo settings.py con ‘ENGINE’: ‘django.db.backends.mysql’, no use ‘ENGINE’: ‘mysql.connector.django’,

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