fai in modo che Python sostituisca i caratteri non codificabili con una stringa per impostazione predefinita

StackOverflow https://stackoverflow.com/questions/1933184

  •  20-09-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top