fai in modo che Python sostituisca i caratteri non codificabili con una stringa per impostazione predefinita
Domanda
Voglio fare in modo che Python ignori i caratteri che non può codificare, semplicemente sostituendoli con la stringa "<could not encode>"
.
Ad esempio, supponendo che la codifica predefinita sia ascii, il comando
'%s is the word'%'ébác'
cederebbe
'<could not encode>b<could not encode>c is the word'
Esiste un modo per rendere questo il comportamento predefinito, in tutto il mio progetto?
Soluzione
IL str.encode
la funzione accetta un argomento facoltativo che definisce la gestione degli errori:
str.encode([encoding[, errors]])
Dai documenti:
Restituisce una versione codificata della stringa.La codifica predefinita è la codifica di stringa predefinita corrente.possono essere forniti errori per impostare un diverso schema di gestione degli errori.Il valore predefinito per gli errori è 'strict', il che significa che gli errori di codifica sollevano un UnicodeError.Altri valori possibili sono 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' e qualsiasi altro nome registrato tramite codecs.register_error(), vedere la sezione Classi base codec.Per un elenco delle possibili codifiche, vedere la sezione Codifiche standard.
Nel tuo caso, il codecs.register_error
la funzione potrebbe interessare
[Nota su personaggi cattivi]
A proposito, nota quando lo usi register_error
che probabilmente ti ritroverai a sostituire non solo singoli caratteri errati ma gruppi di caratteri errati consecutivi con la tua stringa, a meno che tu non presti attenzione.Ricevi una chiamata al gestore degli errori per ogni esecuzione di caratteri errati, non per carattere.
Altri suggerimenti
>>> 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.
Quindi, ad 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 richiamata a codecs.register_error da sostituire con la stringa di tua scelta.