python - open - UnicodeDecodeError: el códec ''ascii'' no puede decodificar el byte 0xef en la posición 1
python open encoding (15)
Estoy teniendo algunos problemas al intentar codificar una cadena para UTF-8. He intentado varias cosas, incluido el uso de string.encode(''utf-8'')
y unicode(string)
, pero me sale el siguiente error:
UnicodeDecodeError: el códec ''ascii'' no puede decodificar byte 0xef en posición 1: ordinal no en rango (128)
Esta es mi cadena:
(。・ω・。)ノ
No veo lo que está pasando, ¿alguna idea?
Editar: El problema es que imprimir la cadena tal como está no se muestra correctamente. Además, este error cuando intento 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)
BOM, a menudo es BOM para mí
vi el archivo, use
:set nobomb
y guárdalo Eso casi siempre lo arregla en mi caso
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) "
Está bien usar el siguiente código en la parte superior de la secuencia de comandos, como sugirió .
import sys
reload(sys)
sys.setdefaultencoding(''utf-8'')
Pero le sugiero que también agregue la línea # -*- coding: utf-8 -*
en la parte superior del script.
Omitir arroja el siguiente error en mi caso cuando intento 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 se ejecutó. 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.
Esta es la mejor respuesta: https://.com/a/4027726/2159089
en linux:
export PYTHONIOENCODING=utf-8
por lo que sys.stdout.encoding
está bien.
Esto tiene que ver con la codificación de su terminal que no está 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, el ejemplo funciona con el anterior, pero si me deshago de la configuración de 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 "<stdin>", line 1, in <module>
UnicodeEncodeError: ''ascii'' codec can''t encode characters in position 1-5: ordinal not in range(128)
>>>
Consulte los documentos de su variante de Linux para descubrir cómo hacer que este cambio sea permanente.
Intente configurar la codificación predeterminada del sistema como utf-8
al comienzo de la secuencia de comandos, de modo que todas las cadenas estén codificadas con eso.
import sys
reload(sys)
sys.setdefaultencoding(''utf-8'')
Mi +1 al comentario de mata en https://.com/a/10561979/1346705 y a la demostración de Nick Craig-Wood. Usted ha decodificado la cadena correctamente. El problema es con el comando de 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 mira el resultado usando algún 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()
Entonces verás (。・ω・。)ノ
.
No hay problemas con mi terminal. Las respuestas anteriores me ayudaron a mirar en la dirección correcta, pero no funcionó para mí hasta que agregué ''ignore''
:
fix_encoding = lambda s: s.decode(''utf8'', ''ignore'')
Como se indica en el comentario a continuación, 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.
Parece que su cadena está codificada para utf-8
, entonces, ¿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''
Recibí el mismo tipo de error y descubrí que la consola no puede 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 ])
Resuelvo ese problema cambiando en el archivo settings.py con ''ENGINE'': ''django.db.backends.mysql'', no uso ''ENGINE'': ''mysql.connector.django'',
Si está trabajando en un host remoto , consulte /etc/ssh/ssh_config
en su PC local .
Cuando este archivo contiene una línea:
SendEnv LANG LC_*
coméntelo agregando #
al principio 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.
Simplemente convierta el texto explícitamente en una cadena usando str()
. Trabajó para mi.
esto funciona para ubuntu 15.10:
sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
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 hubiera una conversión implícita (podría ser imprimir, escribir en una transmisión ...)
para decir más, necesitaremos ver algún código.