2011-02-24 23 views
19

Tengo una aplicación bastante grande de Python 2.6 con muchas declaraciones de impresión salpicadas. Estoy usando cadenas Unicode en todo momento, y generalmente funciona muy bien. Sin embargo, si vuelvo a dirigir la salida de la aplicación (como "myapp.py> salida.txt"), entonces de vez en cuando aparecen errores como este:Linux/Python: codificación de una cadena Unicode para imprimir

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 puesto su LOCALE a ASCII. Ahora, entiendo perfectamente la razón de este error. Hay caracteres en mis cadenas Unicode que no son posibles de codificar en ASCII. Lo suficientemente justo. Pero me gustaría que mi programa Python hiciera un gran esfuerzo para intentar imprimir algo comprensible, tal vez omitiendo los caracteres sospechosos o reemplazándolos con sus identificadores 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 usando la antigua "impresión" simple, pero puedo modificar todas las ocurrencias si es necesario.

PD: Ahora he resuelto este problema. La solución no fue ninguna de las respuestas dadas. Usé el método dado en http://wiki.python.org/moin/PrintFails, dado por ChrisJ en uno de los comentarios. Es decir, reemplazo sys.stdout con un contenedor que llama codificación Unicode con los argumentos correctos. Funciona muy bien

+0

¿Cómo es "ASCII" una localidad? –

+0

posible duplicado de [Si un programa de línea de comando no está seguro de la codificación de stdout, ¿qué codificación debería generar?] (Http://stackoverflow.com/questions/5013599/if-a-command-line-program-is-unsure- of-stdouts-encoding-what-encoding-should-it) –

+0

Aquí hay dos punteros que pueden ser útiles: http://wiki.python.org/moin/PrintFails - http://stackoverflow.com/questions/1473577/ writing-unicode-strings-via-sys-stdout-in-python – ChrisJ

Respuesta

5

He resuelto este problema. La solución no fue ninguna de las respuestas dadas. Usé el método dado en http://wiki.python.org/moin/PrintFails, dado por ChrisJ en uno de los comentarios. Es decir, reemplazo sys.stdout con un contenedor que llama codificación Unicode con los argumentos correctos. Funciona muy bien

+1

No veo ningún comentario en la página. ¿Puedes reproducir tu solución aquí? –

18

Si está descargando 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 los 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 
2

Cualquiera de envolver todo su estado de impresión a través de un método de realizar Unicode arbitraria -> conversión UTF8 o como último recurso cambiar la codificación predeterminada de Python de ascii a utf-8 dentro de su sitio.py. En general, es una mala idea imprimir cadenas unicode sin filtrar a sys.stdout ya que Python activará una conversión implícita de cadenas unicode a la codificación predeterminada configurada que es ascii.

Cuestiones relacionadas