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
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.)
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')
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.
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'
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'
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