C'è un bug in python 2.x è stato risolto solo python 3.x. In effetti, questo bug è presente anche nell'iconv di OS X (ma non in quello glibc).
Ecco cosa sta succedendo:
Python 2.x non riconosce le coppie di surrogati UTF8 [1] come non valide (che è la sequenza di caratteri)
Questo dovrebbe essere tutto ciò che serve:
foo.decode('utf8').encode('utf8')
Ma grazie a quel bug che non stanno risolvendo, non cattura le coppie surrogate.
Prova questo in Python 2.x e poi in 3.x:
b'\xed\xbd\xbf'.decode('utf8')
Genererà un errore (correttamente) in quest'ultimo. Non lo stanno risolvendo nemmeno nel ramo 2.x. Vedi [2] e [3] per maggiori informazioni
[1] https://www.rfc-editor.org/rfc/ rfc3629#sezione-4
[2] http://bugs.python.org/issue9133
[3] http://bugs.python.org/issue8271#msg102209