python encoding - UnicodeDecodeError:el códec 'ascii' no puede decodificar el byte 0xef en la posición 1




utf-8 utf8 (13)

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'

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)

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.


esto funciona para ubuntu 15.10:

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

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


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.


BOM, a menudo es BOM para mí

vi el archivo, use

:set nobomb

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


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 ])

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

en linux:

export PYTHONIOENCODING=utf-8

por lo que sys.stdout.encoding está bien.


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) "


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.


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')

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.


En Python 2.6+, puedes usar io.open() que es predeterminado ( incorporado en open() ) en Python 3:

import io

with io.open(filename, 'w', encoding=character_encoding) as file:
    file.write(unicode_text)

Podría ser más conveniente si necesita escribir el texto de manera incremental (no necesita llamar a unicode_text.encode(character_encoding) varias veces). A diferencia del módulo de codecs , el módulo io tiene un adecuado soporte para nuevas líneas universales.





python unicode utf-8