UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ xa0' en la posición 20: el ordinal no está en el rango (128)

1300

Tengo problemas para tratar con caracteres Unicode del texto obtenido de diferentes páginas web (en diferentes sitios). Estoy usando BeautifulSoup.

El problema es que el error no siempre es reproducible; a veces funciona con algunas páginas y, a veces, irrita lanzando a UnicodeEncodeError. He intentado casi todo lo que se me ocurre y, sin embargo, no he encontrado nada que funcione de manera consistente sin arrojar algún tipo de error relacionado con Unicode.

A continuación se muestra una de las secciones de código que está causando problemas:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

Aquí hay un seguimiento de pila producido en ALGUNAS cadenas cuando se ejecuta el fragmento anterior:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

Sospecho que esto se debe a que algunas páginas (o más específicamente, páginas de algunos de los sitios) pueden estar codificadas, mientras que otras pueden estar sin codificar. Todos los sitios están ubicados en el Reino Unido y proporcionan datos destinados al consumo del Reino Unido, por lo que no hay problemas relacionados con la internalización o el tratamiento de textos escritos en otro idioma que no sea inglés.

¿Alguien tiene alguna idea sobre cómo resolver esto para que pueda solucionar este problema de manera CONSISTENTE?

Homunculus Reticulli
fuente
1
Si recibe estos errores como usuario en lugar de como desarrollador, consulte serverfault.com/questions/54591/… y askubuntu.com/questions/599808/…
Ese chico brasileño el
Agregaré este punto, no use onlinegdb.com/online_python_interpreter para estas cosas. ¡Estaba usando ese intérprete para probar cosas y no está configurado correctamente para Unicode! Siempre estaba imprimiendo en un formato 'B' \ nnn '' ... ¡cuando todo lo que quería era un guillemet! Intenté en una máquina virtual y funcionó inmediatamente como se esperaba usando chr ()
JGFMK
44
Intenta esto import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore')).
hhh
@hhh Ejecuté tu fragmento NameError: el nombre 'myText' no está definido
KHAN irfan
99
Intente configurar PYTHONIOENCODING en el shell, antes de ejecutar su script:$ export PYTHONIOENCODING=utf8
Noam Manos

Respuestas:

1367

Debe leer el CÓMO de Python Unicode . Este error es el primer ejemplo .

Básicamente, deje de usar strpara convertir unicode a texto / bytes codificados.

En su lugar, use adecuadamente .encode()para codificar la cadena:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

o trabajar completamente en unicode.

agf
fuente
23
¡convenido! una buena regla general que me enseñaron es usar la idea del "sandwich unicode". Su script acepta bytes del mundo exterior, pero todo el procesamiento debe realizarse en unicode. ¡Solo cuando esté listo para generar sus datos, se deben volver a agrupar en bytes!
Andbdrew
256
En caso de que alguien más se confunda con esto, encontré algo extraño: mi terminal usa utf-8, y cuando uso printmis cadenas utf-8 funciona muy bien. Sin embargo, cuando canalizo la salida de mis programas a un archivo, arroja un UnicodeEncodeError. De hecho, cuando se redirige la salida (en un archivo o una tubería), me parece que sys.stdout.encodinges None! La tachuela .encode('utf-8')resuelve el problema.
drevicko
93
@drevicko: use PYTHONIOENCODING=utf-8en su lugar, es decir, imprima cadenas Unicode y deje que el entorno establezca la codificación esperada.
jfs
1
@steinar: nada es válido en todos los casos. En general, a un usuario no debería importarle que use Python para implementar su utilidad (la interfaz no debería cambiar si decide volver a implementarla en otro idioma por cualquier razón) y, por lo tanto, no debe esperar que ese usuario esté al tanto de python- Envvars específicos. Es una mala interfaz de usuario obligar al usuario a especificar la codificación de caracteres; incrustar la codificación de caracteres en el formato del informe si es necesario. Nota: ninguna codificación codificada puede ser un "valor predeterminado razonable" en el caso general.
jfs
13
Este es un consejo malo y confuso. La razón por la que las personas usan str es porque el objeto NO ES ya una cadena, por lo que no hay ningún .encode()método para llamar.
Cerin
434

¡Este es un clásico punto de dolor de Python Unicode! Considera lo siguiente:

a = u'bats\u00E0'
print a
 => batsà

Todo bien hasta ahora, pero si llamamos str (a), veamos qué sucede:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

¡Oh, chapuzón, eso no le hará ningún bien a nadie! Para corregir el error, codifique los bytes explícitamente con .encode y dígale a Python qué códec usar:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

El problema es que cuando llamas a str (), python usa la codificación de caracteres predeterminada para intentar codificar los bytes que le diste, que en tu caso a veces son representaciones de caracteres unicode. Para solucionar el problema, debe decirle a Python cómo manejar la cadena que le da usando .encode ('whatever_unicode'). La mayoría de las veces, debería estar bien con utf-8.

Para una excelente exposición sobre este tema, vea la charla PyCon de Ned Batchelder aquí: http://nedbatchelder.com/text/unipain.html

Andbdrew
fuente
85
Nota personal: cuando intente escribir ".encode" no escriba accidentalmente ".unicode" y luego pregunte por qué nada funciona.
Skip Huffman
99
Buen consejo. Pero, ¿qué haces cuando estabas usando str (x) para imprimir objetos que pueden o no ser cadenas? str (x) funciona si x es un número, fecha y hora, cadena booleana o normal. De repente, si es unicode, deja de funcionar. ¿Hay alguna manera de obtener el mismo comportamiento o ahora necesitamos agregar una verificación IF para probar si el objeto es una cadena para usar .encode y str () de lo contrario?
Dirk R
La misma pregunta podría hacerse con Nonevalor.
Vadorequest
210

Encontré una solución elegante para mí para eliminar símbolos y continuar manteniendo la cadena como cadena de la siguiente manera:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

Es importante notar que usar la opción de ignorar es peligroso porque silenciosamente elimina cualquier soporte unicode (e internacionalización) del código que lo usa, como se ve aquí (convertir unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
Max Korolevsky
fuente
17
¡Me has alegrado el día! Para utf-8, es suficiente hacer:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76
para mí esto funcionó pero mi caso era diferente, estaba guardando nombres de archivo y tenía "/" en el nombre y la ruta no existía, así que tengo que usar .replace ("/", "") y así guardar guión mio mientras que ignorar el ascii también funciona para el caso 'utf-8' también.
Akash Kandpal
1
@ harrypotter0 para concatenar correctamente las rutas de archivos os.path.join(), es un muy buen hábito cuando comienzas a hacer programación multiplataforma. :)
login_not_failed
152

bueno, intenté todo pero no me ayudó, después de buscar en Google pensé lo siguiente y me ayudó. Python 2.7 está en uso.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Ashwin
fuente
77
No hagas esto. stackoverflow.com/questions/3828723/… , aunque cuando tenga respuestas como esta stackoverflow.com/a/31137935/2141635 cerca de la parte superior de los resultados cuando busque el error, puedo ver por qué puede parecer una buena idea.
Padraic Cunningham
21
Intenté casi todas las sugerencias en este tema y realmente ninguna funcionó para mí. Finalmente probé este. Y es realmente EL ÚNICO que funcionó simple y bien. Si alguien decir "no hacen esto, entonces ven con una simple solución de uso lo contrario éste Debido a que es una buena solución de copia de trabajo y más allá...
Richard de Ree
44
¿Cómo podría hacerse esto en python3? Estaría feliz de saberlo.
Kanerva Peter
3
Después de tanta frustración, esta funcionó. Gracias un montón.
Avraham Zhurba
44
Yo sólo añadiría unif sys.version_info.major < 3:
contrato de Profesor Falken violado
87

Un problema sutil que hace que incluso la impresión falle es tener las variables de entorno configuradas incorrectamente, por ejemplo. aquí LC_ALL establecido en "C". En Debian desaconsejan configurarlo: Debian wiki on Locale

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
maxpolk
fuente
Tengo exactamente el mismo problema, tan malo que no lo revisé antes de informar . Muchas gracias. Por cierto, puede reemplazar los dos primeros comandos con env|grep -E '(LC|LANG)'.
Dmitry Verhoturov
Solo mis dos centavos por un problema de codificación incorrecto. Frecuentemente utilizo mcen "modo de subcapa" ( Ctrl-O) y también olvidé que añadido los siguientes alias a bash: alias mc="LANG=en_EN.UTF-8 mc". Entonces, cuando traté de ejecutar scripts mal escritos que dependen ru_RU.UTF-8internamente, simplemente mueren. Intenté muchas cosas de este hilo antes de descubrir el verdadero problema. :)
login_not_failed
USTED ES MARAVILLOSO. En GSUTIL, mi rsync estaba fallando debido exactamente a este problema. Se corrigió el LC_ALL y todo funciona bien como vino. <3 GRACIAS <3
dsignr
27

Para mí, lo que funcionó fue:

BeautifulSoup(html_text,from_encoding="utf-8")

Espero que esto ayude a alguien.

Animesh
fuente
25

De hecho, he descubierto que en la mayoría de mis casos, simplemente quitar esos caracteres es mucho más simple:

s = mystring.decode('ascii', 'ignore')
Phil LaNasa
fuente
26
"Perfectamente" no suele ser lo que realiza. Tira a la basura cosas con las que deberías descubrir cómo lidiar adecuadamente.
tripleee
77
simplemente eliminar "esos" caracteres (que no están en inglés) no es la solución ya que Python debe ser compatible con todos los idiomas, ¿no crees?
alemol
8
Voto negativo Esta no es la solución correcta en absoluto. Aprenda a trabajar con Unicode: joelonsoftware.com/articles/Unicode.html
Andrew Ferrier
44
Mire, la forma más juiciosa de presentar esta respuesta particular es de esta manera: reconociendo que ASCII confiere un cierto privilegio a ciertos idiomas y usuarios: esta es la escotilla de escape que puede ser explotada para aquellos usuarios que pueden estar pirateando un primer paso superficial. , script juntos potencialmente para el trabajo preliminar antes de que se implemente el soporte completo de Unicode.
lol
55
Si estoy escribiendo un script que solo necesita imprimir texto en inglés para stdout en una aplicación interna de la compañía, solo quiero que el problema desaparezca. Lo que sea que funcione.
kagronick
25

El problema es que está intentando imprimir un carácter unicode, pero su terminal no lo admite.

Puede intentar instalar el language-pack-enpaquete para arreglar eso:

sudo apt-get install language-pack-en

que proporciona actualizaciones de datos de traducción al inglés para todos los paquetes compatibles (incluido Python). Instale un paquete de idioma diferente si es necesario (dependiendo de los caracteres que está intentando imprimir).

En algunas distribuciones de Linux es necesario para asegurarse de que las configuraciones regionales inglesas predeterminadas estén configuradas correctamente (para que shell / terminal pueda manejar los caracteres unicode). A veces es más fácil instalarlo que configurarlo manualmente.

Luego, al escribir el código, asegúrese de usar la codificación correcta en su código.

Por ejemplo:

open(foo, encoding='utf-8')

Si todavía tiene un problema, verifique la configuración de su sistema, como:

  • Su archivo de configuración regional ( /etc/default/locale), que debería tener p. Ej.

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    o:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • Valor de LANG/ LC_CTYPEen shell.

  • Compruebe qué configuración regional admite su shell:

    locale -a | grep "UTF-8"

Demostrando el problema y la solución en VM nueva.

  1. Inicialice y aprovisione la VM (por ejemplo, usando vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    Ver: cuadros de Ubuntu disponibles . .

  2. Impresión de caracteres unicode (como el signo de marca como ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. Ahora instalando language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. Ahora el problema debe resolverse:

    $ python -c 'print(u"\u2122");'
    
  5. De lo contrario, intente el siguiente comando:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    
kenorb
fuente
1
¿Qué tiene language-pack-enque ver con Python o esta pregunta? AFAIK, puede proporcionar traducciones de idiomas a los mensajes, pero no tiene nada que ver con la codificación
Alastair McCormack
2
En algunas distribuciones de Linux es necesario para asegurarse de que las configuraciones regionales inglesas predeterminadas estén configuradas correctamente, especialmente cuando se ejecuta el script Python en la Terminal. Funcionó para mí en un punto. Ver: codificación de caracteres
kenorb
Ah ok ¿Quieres decir si quieres usar una configuración regional que no sea en inglés? ¿Supongo que el usuario también tendrá que editar /etc/locale.genpara asegurarse de que su configuración regional esté construida antes de usarla?
Alastair McCormack
1
@AlastairMcCormack Comentó LANGdesde /etc/default/locale(como/etc/locale.gen existe) y se ejecutó locale-gen, pero no ayudó. No estoy seguro de qué language-pack-enhace exactamente, ya que no encontré mucha documentación y enumerar el contenido no ayuda mucho.
kenorb
1
es poco probable que no haya configuraciones regionales utf-8 en un sistema de escritorio, es decir, es probable que no necesite instalar nada, solo configure LANG/ LC_CTYPE/ en su LC_ALLlugar (por ejemplo, LANG=C.UTF-8).
jfs
19

Con cáscara:

  1. Busque la configuración regional UTF-8 compatible con el siguiente comando:

    locale -a | grep "UTF-8"
  2. Exportarlo, antes de ejecutar el script, por ejemplo:

    export LC_ALL=$(locale -a | grep UTF-8)

    o manualmente como:

    export LC_ALL=C.UTF-8
  3. Pruébelo imprimiendo caracteres especiales, por ejemplo :

    python -c 'print(u"\u2122");'

Probado anteriormente en Ubuntu.

kenorb
fuente
Sí, esta es la mejor respuesta corta, no podemos modificar el código fuente para usar .encode
Luat Nguyen - Neo.Mxn0
16

Agregue la siguiente línea al comienzo de su secuencia de comandos (o como segunda línea):

# -*- coding: utf-8 -*-

Esa es la definición de la codificación del código fuente de Python. Más información en PEP 263 .

Andriy Ivaneyko
fuente
2
Esto no resuelve el problema cuando el texto procesado cargado desde un archivo externo contiene codificaciones utf-8. Esto ayuda solo para los literales escritos en el script de Python dado y es solo una pista para el intérprete de Python, pero no tiene ningún impacto en el procesamiento de texto.
Mikaelblomkvistsson
16

Aquí hay una repetición de algunas de las llamadas respuestas de "cop out". Hay situaciones en las que simplemente tirar los caracteres / cadenas problemáticos es una buena solución, a pesar de las protestas expresadas aquí.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

Probándolo:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

Resultados:

1
test
98°
98

Sugerencia: ¿es posible que desee nombrar esta función en su toAsciilugar? Eso es una cuestión de preferencia.

Esto fue escrito para Python 2. Para Python 3, creo que querrá usar en bytes(obj,"ascii")lugar de str(obj). Todavía no probé esto, pero lo haré en algún momento y revisaré la respuesta.

BuvinJ
fuente
8

Siempre pongo el siguiente código en las dos primeras líneas de los archivos de Python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
Pereira
fuente
6

Funciones auxiliares simples que se encuentran aquí .

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')
Parag Tyagi
fuente
Para obtener el escaparon cadena de bytes (para convertir cadena Unicode arbitraria de bytes utilizando la codificación ASCII), se puede usar backslashreplacegestor de errores: u'\xa0'.encode('ascii', 'backslashreplace'). Aunque debe evitar dicha representación y configurar su entorno para aceptar caracteres que no sean ascii, ¡es 2016!
jfs
Feliz año nuevo @JFSebastian. Simplemente me sentí frustrado con el problema Python-Unicode y finalmente obtuve esta solución que estaba funcionando. No sabía sobre esto. De todos modos gracias por el consejo.
Parag Tyagi
6

Simplemente agregue a una codificación variable ('utf-8')

agent_contact.encode('utf-8')
Kairat Koibagarov
fuente
4

Abra la terminal y active el siguiente comando:

export LC_ALL="en_US.UTF-8"
Hồ Ngọc Vượng
fuente
3

Acabo de usar lo siguiente:

import unicodedata
message = unicodedata.normalize("NFKD", message)

Compruebe lo que dice la documentación al respecto:

unicodedata.normalize (form, unistr) Devuelve el formulario normal para la cadena Unicode unistr. Los valores válidos para el formulario son 'NFC', 'NFKC', 'NFD' y 'NFKD'.

El estándar Unicode define varias formas de normalización de una cadena Unicode, basadas en la definición de equivalencia canónica y equivalencia de compatibilidad. En Unicode, se pueden expresar varios caracteres de varias maneras. Por ejemplo, el carácter U + 00C7 (LETRA DE CAPITAL LATINA C CON CEDILLA) también se puede expresar como la secuencia U + 0043 (LETRA DE CAPITAL LATINO C) U + 0327 (CEDILLA COMBINADA).

Para cada carácter, hay dos formas normales: la forma normal C y la forma normal D. La forma normal D (NFD) también se conoce como descomposición canónica, y traduce cada carácter a su forma descompuesta. La forma normal C (NFC) primero aplica una descomposición canónica, luego compone nuevamente los caracteres combinados previamente.

Además de estas dos formas, hay dos formas normales adicionales basadas en la equivalencia de compatibilidad. En Unicode, se admiten ciertos caracteres que normalmente se unificarían con otros caracteres. Por ejemplo, U + 2160 (ROMAN NUMERAL ONE) es realmente lo mismo que U + 0049 (LATIN CAPITAL LETTER I). Sin embargo, es compatible con Unicode por compatibilidad con juegos de caracteres existentes (por ejemplo, gb2312).

La forma normal KD (NFKD) aplicará la descomposición de compatibilidad, es decir, reemplazará todos los caracteres de compatibilidad con sus equivalentes. La forma normal KC (NFKC) aplica primero la descomposición de compatibilidad, seguida de la composición canónica.

Incluso si dos cadenas Unicode están normalizadas y tienen el mismo aspecto para un lector humano, si una tiene caracteres combinados y la otra no, es posible que no se comparen igual.

Lo resuelve por mi. Simple y fácil.

Arrastrar0
fuente
3

La siguiente solución funcionó para mí, acaba de agregar

u "Cadena"

(representando la cadena como unicode) antes de mi cadena.

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)
Aravind Krishnakumar
fuente
3

Por desgracia, esto funciona en Python 3 al menos ...

Python 3

A veces, el error está en las variables de entorno y por lo tanto

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

donde los errores se ignoran en la codificación.

hhh
fuente
2

Acabo de tener este problema y Google me llevó aquí, así que para agregar a las soluciones generales aquí, esto es lo que funcionó para mí:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

Tuve esta idea después de leer la presentación de Ned .

Sin embargo, no pretendo entender completamente por qué esto funciona. Entonces, si alguien puede editar esta respuesta o poner un comentario para explicar, lo agradeceré.

pepoluan
fuente
3
¿Cuál es el typevalor? antes y después de esto? Creo que eso funciona porque al hacer un unic += valueque es lo mismo unic = unic + valueque agregar una cadena y unicode, donde python asume unicode para el resultante, unices decir, el tipo más preciso (piense cuando hace esto a = float(1) + int(1), se aconvierte en un flotador) y luego value = unicseñala valueel nuevo unicobjeto que resulta ser unicode.
Tom Myddeltyn
2

Detectamos este error cuando ejecutamos manage.py migrateen Django con accesorios localizados.

Nuestra fuente contenía la # -*- coding: utf-8 -*-declaración, MySQL estaba configurado correctamente para utf8 y Ubuntu tenía el paquete de idioma y los valores apropiados /etc/default/locale.

El problema era simplemente que al contenedor Django (usamos docker) le faltaba el LANG var.

Configuración LANGde en_US.UTF-8arranque y reinicio del envase antes de volver a ejecutar las migraciones arreglaron el problema.

followben
fuente
1

Muchas respuestas aquí (@agf y @Andbdrew, por ejemplo) ya han abordado los aspectos más inmediatos de la pregunta OP.

Sin embargo, creo que hay un aspecto sutil pero importante que se ha ignorado en gran medida y que es muy importante para todos los que como yo terminamos aquí mientras intentamos dar sentido a las codificaciones en Python: la gestión de la representación de personajes en Python 2 vs Python 3 es muy diferente . Siento que una gran parte de la confusión tiene que ver con personas que leen sobre codificaciones en Python sin ser conscientes de la versión.

Sugiero que cualquier persona interesada en comprender la causa raíz del problema de OP comience leyendo la introducción de Spolsky a las representaciones de personajes y Unicode y luego pase a Batchelder en Unicode en Python 2 y Python 3.

Simón Ramírez Amaya
fuente
sí, mi error fue en python 2.7, 'a'.format (u'ñ'), y la solución correcta no es usar .encode ('utf-8') sino usar siempre cadenas unicode, (el valor predeterminado en python 3 ): u'a'.format (u'ñ '),
Rogelio
1

Intente evitar la conversión de variable a str (variable). A veces, puede causar el problema.

Consejo simple para evitar:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

El ejemplo anterior también resolverá el error de codificación.

sam ruben
fuente
esto no funciona, ya que te encontrarás con el error en la excepción
Aurele Collinet
0

Si tiene algo como packet_data = "This is data"esto, haga esto en la siguiente línea, justo después de inicializar packet_data:

unic = u''
packet_data = unic
Nandan Kulkarni
fuente
0

Tuve este problema al intentar generar caracteres Unicode stdout, pero con sys.stdout.write, en lugar de imprimir (para poder admitir la salida a un archivo diferente también).

De la documentación de BeautifulSoup , resolví esto con la biblioteca de códecs:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)
palswim
fuente
0

Este problema a menudo ocurre cuando un proyecto django se implementa usando Apache. Porque Apache establece la variable de entorno LANG = C en / etc / sysconfig / httpd. Simplemente abra el archivo y comente (o cambie su flavour) esta configuración. O utilice la opción lang del comando WSGIDaemonProcess, en este caso podrá establecer diferentes variables de entorno LANG en diferentes hosts virtuales.

shmakovpn
fuente
0

La solución recomendada no funcionó para mí y podría vivir eliminando todos los caracteres no ascii, así que

s = s.encode('ascii',errors='ignore')

lo que me dejó con algo despojado que no arroja errores.

Gulzar
fuente
0

Esto funcionará:

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

Salida:

>>>bats
Huzefa Usama
fuente
0

En el caso general de escribir esta cadena de codificación no compatible (digamos ) en algún archivo (por ejemplo ), esto funcionadata_that_causes_this_errorresults.txt

f = open("results.txt", "w")
  f.write(data_that_causes_this_error.encode('utf-8'))
  f.close()
Pe Dro
fuente