open - unicode escape python
Linux/Python: codificando una cadena Unicode para imprimir (3)
Ahora he resuelto este problema. La solución no fue ninguna de las respuestas dadas. Utilicé el método dado en http://wiki.python.org/moin/PrintFails , como lo dio ChrisJ en uno de los comentarios. Es decir, sustituyo sys.stdout con un contenedor que llama a unicode codificar con los argumentos correctos. Funciona muy bien
Tengo una aplicación Python 2.6 bastante grande con muchas declaraciones impresas esparcidas. Estoy usando cadenas Unicode en todo, y por lo general funciona muy bien. Sin embargo, si redirecciono la salida de la aplicación (como "myapp.py> output.txt"), ocasionalmente obtengo errores como este:
UnicodeEncodeError: ''ascii'' codec can''t encode character u''/xa1'' in position 0: ordinal not in range(128)
Supongo que el mismo problema surge si alguien ha establecido su LOCALE en ASCII. Ahora, entiendo perfectamente bien la razón de este error. Hay caracteres en mis cadenas Unicode que no se pueden codificar en ASCII. Lo suficientemente justo. Pero me gustaría que mi programa de Python haga un mejor esfuerzo para intentar imprimir algo comprensible, tal vez saltándose los caracteres sospechosos o reemplazándolos con sus ID de Unicode.
Este problema debe ser común ... ¿Cuál es la mejor práctica para manejar este problema? Preferiría una solución que me permita seguir utilizando la "impresión" simple, pero puedo modificar todas las incidencias si es necesario.
PD: ahora he resuelto este problema. La solución no fue ninguna de las respuestas dadas. Utilicé el método dado en http://wiki.python.org/moin/PrintFails , como lo dio ChrisJ en uno de los comentarios. Es decir, sustituyo sys.stdout con un contenedor que llama a unicode codificar con los argumentos correctos. Funciona muy bien
Envuelva toda su declaración de impresión a través de un método, realice la conversión unicode arbitraria -> utf8 o como último recurso cambie la codificación predeterminada de Python de ascii a utf-8 dentro de su sitio.py. En general, es una mala idea imprimir cadenas de Unicode sin filtrar a sys.stdout, ya que Python activará una conversión implícita de cadenas de Unicode a la codificación predeterminada configurada que es ascii.
Si está volcando a un terminal ASCII, codifique manualmente usando unicode.encode
, y especifique que los errores deben ignorarse.
u = u''/xa0''
u.encode(''ascii'') # This fails
u.encode(''ascii'', ''ignore'') # This replaces failed encoding attempts with empty string
Si desea almacenar archivos Unicode, intente esto:
u = u''/xa0''
print >>open(''out'', ''w''), u # This fails
print >>open(''out'', ''w''), u.encode(''utf-8'') # This is ok