UnicodeDecodeError, invalid continuation byte

Dlaczego poniższy element nie działa? i dlaczego udaje się z kodekiem" latin-1"?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

Wyniki w:

 Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte
Author: bgporter, 2011-04-05

5 answers

W binarnym 0xe9 wygląda jak 1110 1001. Jeśli przeczytasz o UTF-8 na Wikipedii , zobaczysz, że po takim bajcie muszą być dwa z postaci 10xx xxxx. Na przykład:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'
Ale to tylko mechaniczna przyczyna wyjątku. W tym przypadku masz ciąg, który jest prawie na pewno zakodowany w latin 1. Możesz zobaczyć jak UTF-8 i latin 1 wyglądają inaczej:
>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(Uwaga, używam tutaj kombinacji reprezentacji Pythona 2 i 3. Wejście jest ważne w dowolnej wersji Pythona, ale twój interpreter Pythona raczej nie pokaże w ten sposób zarówno znaków unicode, jak i bajtów.)

 177
Author: Josh Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-05 16:56:41

Miałem ten sam błąd, gdy próbowałem otworzyć plik csv metodą pandas read_csv.

Rozwiązaniem była zmiana kodowania na 'latin-1':

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')
 113
Author: Mazen Aly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 18:13:40

Jest nieprawidłowy UTF-8. Znak ten jest znakiem e-ostrym w ISO-Latin1, dlatego odnosi sukces z tym zestawem kodowym.

Jeśli nie znasz zestawu kodowego, w którym otrzymujesz ciągi, masz małe kłopoty. Najlepiej byłoby, gdyby jeden zestaw kodowy (miejmy nadzieję, że UTF-8) został wybrany dla Twojego protokołu/aplikacji, a następnie po prostu odrzuciłbyś te, które nie dekodowały.

Jeśli nie możesz tego zrobić, będziesz potrzebował heurystyki.

 48
Author: Sami J. Lehtinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 13:35:21

Ponieważ UTF-8 jest wielobajtowy i nie ma znaku odpowiadającego Twojej kombinacji \xe9 plus następującej spacji.

Dlaczego ma odnieść sukces w zarówno utf-8 jak i latin-1?

Oto jak powinno być to samo zdanie w utf-8:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'
 35
Author: neurino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 13:28:50

Jeśli ten błąd wystąpi podczas manipulowania plikiem, który został właśnie otwarty, sprawdź, czy został otwarty w trybie 'rb'

 1
Author: Patrick Mutuku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 23:09:08