2012-06-15 16 views
6

Tengo scripts que imprimen mensajes por el sistema de registro o, a veces, imprimen comandos. En la consola de Windows recibo mensajes de error comoPrevenir errores de codificación en Python

Traceback (most recent call last): 
    File "C:\Python32\lib\logging\__init__.py", line 939, in emit 
    stream.write(msg) 
    File "C:\Python32\lib\encodings\cp850.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position 4537:character maps to <undefined> 

¿Hay una manera general para que todas las codificaciones en el sistema de registro, los comandos de impresión, etc. a prueba de fallos (ignorar los errores)?

Respuesta

9

El problema es que su terminal/shell (cmd como está en Windows) no puede imprimir cada carácter Unicode.

Puede codificar a prueba de fallas sus cadenas con el argumento errors del método str.encode. Por ejemplo, puede reemplazar caracteres no compatibles con ? configurando errors='replace'.

>>> s = u'\u2019' 
>>> print s 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp850.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can\'t encode character u'\u2019' in position 
0: character maps to <undefined> 
>>> print s.encode('cp850', errors='replace') 
? 

Ver el documentation para ver otras opciones.

Editar Si desea una solución general para el registro, puede subclase StreamHandler:

class CustomStreamHandler(logging.StreamHandler): 

    def emit(self, record): 
     record = record.encode('cp850', errors='replace') 
     logging.StreamHandler.emit(self, record) 
+0

Pero si pre-codificar todas las cadenas que cambiar el tipo (a bytes) que podría cambiar su comportamiento en el ¿interior? También está en la biblioteca de códec incorporada. No puedo cambiar eso. ¿Puedo establecer una opción en el códec? – Gerenuk

+0

Simplemente los codifica antes de imprimir/registrar, por supuesto. – schlamar

+0

Edité mi respuesta con una solución de registro general. – schlamar

Cuestiones relacionadas