Có một lỗi trong python 2.x chỉ được cố định python 3.x. Trên thực tế, lỗi này thậm chí có trong iconv của OS X (nhưng không phải lỗi glibc).
Đây là những gì đang xảy ra:
Python 2.x không nhận ra các cặp thay thế UTF8 [1] là không hợp lệ (đó là chuỗi ký tự của bạn)
Điều này nên là tất cả những gì cần thiết:
foo.decode('utf8').encode('utf8')
Nhưng nhờ lỗi đó mà họ không sửa, nó không bắt các cặp thay thế.
Hãy thử điều này trong python 2.x và sau đó trong 3.x:
b'\xed\xbd\xbf'.decode('utf8')
Nó sẽ tạo ra một lỗi (chính xác) trong phần sau. Họ cũng không sửa nó trong nhánh 2.x. Xem [2] và [3] để biết thêm thông tin
[1] https://www.rfc-editor.org/rfc/ rfc3629 # section-4
[2] http://bugs.python.org/issue9133
[3] http://bugs.python.org/issue8271#msg102209