regex - utf8 - unicode python 3
"Códec UnicodeEncodeError: ''ascii'' no puede codificar el carácter" (4)
Antes que nada, intente instalar traducciones para el idioma inglés (o cualquier otro si es necesario):
sudo apt-get install language-pack-en
que proporciona actualizaciones de datos de traducción para todos los paquetes compatibles (incluido Python).
Y asegúrese de usar la codificación correcta en su código.
Por ejemplo:
open(foo, encoding=''utf-8'')
Luego revise dos veces la configuración de su sistema como el valor de LANG
o la configuración de la configuración regional ( /etc/default/locale
) y no olvide volver a iniciar sesión.
Estoy tratando de pasar grandes cadenas de html al azar a través de expresiones regulares y mi script de Python 2.6 se está ahogando en esto:
UnicodeEncodeError: el códec ''ascii'' no puede codificar el carácter
Lo remonté a un superíndice de una marca comercial al final de esta palabra: Protection ™, y espero encontrar otros similares en el futuro.
¿Hay algún módulo para procesar caracteres que no sean Ascii? o, ¿cuál es la mejor forma de manejar / escapar de cosas que no son ascii en python?
¡Gracias! Error completo:
E
======================================================================
ERROR: test_untitled (__main__.Untitled)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Python26/Test2.py", line 26, in test_untitled
ofile.write(Whois + ''/n'')
UnicodeEncodeError: ''ascii'' codec can''t encode character u''/u2122'' in position 1005: ordinal not in range(128)
Guión completo:
from selenium import selenium
import unittest, time, re, csv, logging
class Untitled(unittest.TestCase):
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*firefox", "http://www.BaseDomain.com/")
self.selenium.start()
self.selenium.set_timeout("90000")
def test_untitled(self):
sel = self.selenium
spamReader = csv.reader(open(''SubDomainList.csv'', ''rb''))
for row in spamReader:
sel.open(row[0])
time.sleep(10)
Test = sel.get_text("//html/body/div/table/tbody/tr/td/form/div/table/tbody/tr[7]/td")
Test = Test.replace(",","")
Test = Test.replace("/n", "")
ofile = open(''TestOut.csv'', ''ab'')
ofile.write(Test + ''/n'')
ofile.close()
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
Está intentando convertir Unicode en ASCII en modo "estricto":
>>> help(str.encode)
Help on method_descriptor:
encode(...)
S.encode([encoding[,errors]]) -> object
Encodes S using the codec registered for encoding. encoding defaults
to the default encoding. errors may be given to set a different error
handling scheme. Default is ''strict'' meaning that encoding errors raise
a UnicodeEncodeError. Other possible values are ''ignore'', ''replace'' and
''xmlcharrefreplace'' as well as any other name registered with
codecs.register_error that is able to handle UnicodeEncodeErrors.
Probablemente desee algo como uno de los siguientes:
s = u''Protection™''
print s.encode(''ascii'', ''ignore'') # removes the ™
print s.encode(''ascii'', ''replace'') # replaces with ?
print s.encode(''ascii'',''xmlcharrefreplace'') # turn into xml entities
print s.encode(''ascii'', ''strict'') # throw UnicodeEncodeErrors
Estás tratando de pasar una cadena de bytes a algo, pero es imposible (por la escasez de información que proporcionas) decir a qué estás tratando de pasarlo. Empiezas con una cadena Unicode que no puede codificarse como ASCII (el códec predeterminado), por lo que deberás codificar con un códec diferente (o transcribirlo, como @Rate sugiere), pero es imposible de usar. diga qué códec debe usar, porque no sabemos qué está pasando la cadena de bytes y, por lo tanto, no sabemos qué será lo que ese subsistema desconocido podrá aceptar y procesar correctamente en términos de códecs.
En una oscuridad tan total como la que nos deja, utf-8
es una suposición razonablemente ciega (dado que es un códec que puede representar cualquier cadena Unicode exactamente como una cadena de bytes, y es el códec estándar para muchos fines, como XML), pero no puede ser más que una suposición ciega, hasta que nos digas más sobre a qué estás tratando de pasar esa cadena de bytes y con qué fines.
Pasar thestring.encode(''utf-8'')
lugar de bare thestring
definitivamente evitará el error particular que estás viendo en este momento, pero puede resultar en pantallas peculiares (o lo que sea que estés tratando de hacer con esa cadena de bytes! ) a menos que el destinatario esté listo, dispuesto y sea capaz de aceptar la codificación UTF-8 (y ¿cómo podríamos saber, sin tener absolutamente ninguna idea acerca de lo que el destinatario podría ser?! -)
La "mejor" manera siempre depende de sus requisitos; Entonces, ¿qué son los suyos? ¿Ignorar lo que no es ASCII es apropiado? ¿Deberías reemplazar ™ por "(tm)"? (Lo cual parece elegante para este ejemplo, pero se desglosa rápidamente para otros puntos de código, pero puede ser justo lo que desea). ¿Podría la excepción ser exactamente lo que necesita? ahora solo necesitas manejarlo de alguna manera?
Solo tú realmente puedes responder esta pregunta.