2009-12-19 8 views
6

Quiero hacer que python ignore los caracteres que no puede codificar, simplemente reemplazándolos con la cadena "<could not encode>".make python reemplazar caracteres no codificables con una cadena de forma predeterminada

por ejemplo, suponiendo que la codificación por defecto es ASCII, el comando

'%s is the word'%'ébác' 

produciría

'<could not encode>b<could not encode>c is the word' 

¿Hay alguna manera de hacer esto, el comportamiento por defecto, a través de toda mi proyecto?

+0

Si la codificación predeterminada es ascii, ¿qué codificación es esa cadena ''ébác''? –

+0

@ Peter Hansen - tienes razón :) fue solo para explicar lo que quiero ... mal ejemplo. – olamundo

Respuesta

11

La función str.encode toma un argumento opcional que define la gestión de errores:

str.encode([encoding[, errors]]) 

A partir de los documentos:

Volver una versión codificada de la cadena. La codificación predeterminada es la codificación de cadena predeterminada actual. se pueden dar errores para establecer un esquema de manejo de errores diferente. El valor predeterminado para los errores es 'estricto', lo que significa que los errores de codificación generan un error UnicodeError. Otros valores posibles son 'ignorar', 'reemplazar', 'xmlcharrefreplace', 'backslashreplace' y cualquier otro nombre registrado mediante codecs.register_error(), ver la sección Clases Base de Codec. Para obtener una lista de posibles codificaciones, consulte la sección Codificaciones estándar.

En su caso, la función codecs.register_error puede ser de su interés.

[nota sobre caracteres malos]

Por cierto, tenga en cuenta cuando se utiliza register_error que es probable que se encuentra la sustitución de su mala disposición no sólo individuales sino grupos de personajes malos consecutivos con su cadena, a menos que pague atención. Se obtiene una llamada al controlador de errores por ejecución de caracteres incorrectos, no por carácter.

+0

Hay ejemplos de cómo usar 'codecs.register_error' en [este archivo de prueba de Python] (https://github.com/python-git/python/blob/master/Lib/test/test_codeccallbacks.py). –

4
>>> help("".encode) 
Help on built-in function encode: 

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. 

Así, por ejemplo:

>>> x 
'\xc3\xa9b\xc3\xa1c is the word' 
>>> x.decode("ascii") 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 
>>> x.decode("ascii", "replace") 
u'\ufffd\ufffdb\ufffd\ufffdc is the word' 

Haz tu propia devolución de llamada a codecs.register_error para reemplazar con la cadena de su elección.

Cuestiones relacionadas