Komunikat o błędzie mówi dokładnie, co jest nie tak. Interpreter języka Python musi znać kodowanie znaku spoza ASCII.
Jeśli chcesz zwrócić U + 00A3 , możesz powiedzieć
return u'\u00a3'
który reprezentuje ten znak w czystym ASCII za pomocą sekwencji ucieczki Unicode. Jeśli chcesz zwrócić ciąg bajtów zawierający bajt dosłowny 0xA3, to jest
return b'\xa3'
(gdzie w Pythonie 2 b
jest to domniemane, ale jawne jest lepsze niż niejawne).
Połączony PEP w komunikacie o błędzie instruuje dokładnie, jak powiedzieć Pythonowi „ten plik nie jest czystym ASCII; oto kodowanie, którego używam”. Jeśli tak, kodowanie to UTF-8
# coding=utf-8
lub kompatybilny z Emacs
# -*- encoding: utf-8 -*-
Jeśli nie wiesz, jakiego kodowania używa Twój edytor do zapisania tego pliku, sprawdź go za pomocą edytora szesnastkowego i googlingu. Przepełnienie stosukodowanie znakówtag ma stronę informacyjną tagu z dodatkowymi informacjami i poradami dotyczącymi rozwiązywania problemów.
W wielu słowach poza 7-bitowym zakresem ASCII (0x00-0x7F) Python nie może i nie może zgadywać, jaki ciąg reprezentuje sekwencja bajtów. https://tripleee.github.io/8bit#a3 pokazuje 21 możliwych interpretacji bajtu 0xA3, a to tylko ze starszych 8-bitowych kodowań; ale równie dobrze może to być pierwszy bajt kodowania wielobajtowego. Ale tak naprawdę sądzę, że używasz Latin-1, więc powinieneś
# coding: latin-1
jako pierwszy lub drugi wiersz pliku źródłowego. W każdym razie bez wiedzy o tym, jaki charakter ma reprezentować bajt, człowiek nie byłby w stanie zgadnąć.
Zastrzeżenie: na coding: latin-1
pewno usunie komunikat o błędzie (ponieważ nie ma sekwencji bajtów, które nie są technicznie dozwolone w tym kodowaniu), ale może dać całkowicie niepoprawny wynik, gdy kod jest interpretowany, jeśli rzeczywiste kodowanie jest czymś innym. Naprawdę musisz znać kodowanie pliku z całkowitą pewnością, kiedy deklarujesz kodowanie.