Обработка ошибок кодирования / декодирования

.encode и .decode оба имеют режимы ошибок.

По умолчанию 'strict' , что вызывает исключения ошибки. Другие режимы более щадящие.

кодирование

 >>> "£13.55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'£13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55' 

расшифровка

 >>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55' 

боевой дух

Из вышесказанного ясно, что при работе с юникодом и байтами важно сохранять правильность кодировки.