Wystąpił błąd w pythonie 2.x, który jest tylko naprawiony python 3.x. W rzeczywistości ten błąd występuje nawet w iconv OS X (ale nie w glibc).
Oto, co się dzieje:
Python 2.x nie rozpoznaje par zastępczych UTF8 [1] jako niepoprawnych (takich jest twoja sekwencja znaków)
To powinno być wszystkim, co jest potrzebne:
foo.decode('utf8').encode('utf8')
Ale dzięki temu błędowi, którego nie naprawiają, nie wyłapuje par zastępczych.
Wypróbuj to w Pythonie 2.x, a następnie w 3.x:
b'\xed\xbd\xbf'.decode('utf8')
Spowoduje to błąd (poprawnie) w tym drugim. Nie naprawiają tego również w gałęzi 2.x. Zobacz [2] i [3], aby uzyskać więcej informacji
[1] https://www.rfc-editor.org/rfc/ rfc3629#sekcja-4
[2] http://bugs.python.org/issue9133
[3] http://bugs.python.org/issue8271#msg102209