2009-12-19 10 views
6

Voglio fare in modo che Python ignori i caratteri che non può codificare, semplicemente sostituendoli con la stringa "<could not encode>".make python sostituisce i caratteri non codificabili con una stringa di default

per esempio, supponendo che la codifica di default è ASCII, il comando

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

produrrebbe

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

C'è un modo per rendere questo il comportamento predefinito, in tutti il ​​mio progetto?

+0

Se la codifica predefinita è ascii, quale codifica è quella stringa '' ébác''? –

+0

@Peter Hansen - hai ragione :) era solo per spiegare quello che voglio ... cattivo esempio. – olamundo

risposta

11

La funzione str.encode prende un argomento facoltativo definisce la gestione degli errori:

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

Dalla documentazione:

ritorno una versione codificata della stringa. La codifica predefinita è la codifica della stringa predefinita corrente. errori possono essere dati per impostare un diverso schema di gestione degli errori. L'impostazione predefinita per gli errori è "strict", ovvero gli errori di codifica generano un errore Unicode. Altri valori possibili sono "ignore", "replace", "xmlcharrefreplace", "backslashreplace" e qualsiasi altro nome registrato tramite codecs.register_error(), vedere la sezione Codec Base Classes. Per un elenco di possibili codifiche, vedere la sezione Codifiche standard.

Nel tuo caso, la funzione codecs.register_error potrebbe essere di interesse.

[nota su caratteri cattivi]

A proposito, si noti quando si utilizza register_error che è probabile che ritrovi la sostituzione non solo i singoli caratteri male, ma gruppi di personaggi cattivi consecutivi con la stringa, a meno che non si paga Attenzione. Ottieni una chiamata al gestore degli errori per l'esecuzione di caratteri non validi, non per carattere.

+0

Ci sono esempi su come usare 'codecs.register_error' in [questo file di prova di 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. 

Così, per esempio:

>>> 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' 

Aggiungi la tua callback per codecs.register_error per sostituire con la stringa di vostra scelta.

Problemi correlati