2011-10-01 8 views
6

Linia taJak kodować ("ascii", "ignore") rzucić UnicodeDecodeError?

data = get_url_contents(r[0]).encode('ascii', 'ignore') 

produkuje ten błąd

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 11450: ordinal not in range(128) 

Dlaczego? Zakładam, że ponieważ używam "ignore", to nie powinno być możliwe błędy dekodowania przy zapisywaniu wyniku do wartości zmiennej łańcuchowej.

+0

Problem jest z _decoding_, nie _encoding_. To nie to samo. – agf

+0

Wt robi 'get_url_contents'? Wygląda na to, że wyjątek jest wywoływany w tej funkcji, a nie w "kodowaniu". –

+0

@Trindaz, 0xc3 nie jest znakiem ASCII. –

Odpowiedz

3

Z powodu dziwactwa Pythona 2 można wywołać encode na ciągu znaków bajtowych (tzn. Już zakodowanych). W takim przypadku najpierw próbuje przekształcić go w obiekt unicode, dekodując przy pomocy ascii. Tak więc, jeśli get_url_contents wraca ciąg bajtów, linia robi to skutecznie:

get_url_contents(r[0]).decode('ascii').encode('ascii', 'ignore') 

W Pythonie 3, ciągi bajtów nie mają metodę encode, więc ten sam problem po prostu spowodować AttributeError.

(Oczywiście, nie wiem, że to jest problem - może to być związane z funkcją get_url_contents Ale co ja opisany powyżej jest mój najlepszy przypuszczenie.)