Это вводящее в заблуждение сообщение об ошибке, которое происходит от того, как python обрабатывает процесс де / кодирования.Вы пытались декодировать уже декодированную строку во второй раз, и это сбивает с толку функцию Python, которая наносит ответный удар, запутывая вас по очереди!;-) Процесс кодирования / декодирования происходит, насколько я знаю, модулем кодеков.И где-то там лежит источник этих вводящих в заблуждение сообщений об исключениях.
Вы можете проверить сами: либо
u'\x80'.encode('ascii')
, либо
u'\x80'.decode('ascii')
выдаст Unicode Кодировать Ошибка, когда
u'\x80'.encode('utf8')
не будет, но
u'\x80'.decode('utf8')
снова будет!
Я думаю, вы смущены смыслом кодированияи расшифровка.Проще говоря:
decode encode
ByteString (ascii) --------> UNICODE ---------> ByteString (utf8)
codec codec
Но почему существует codec
-аргумент для метода decode
?Итак, базовая функция не может угадать, с каким кодеком была закодирована строка ByteString, так что в качестве подсказки она принимает codec
в качестве аргумента.Если не указано иное, предполагается, что вы подразумеваете, что sys.getdefaultencoding()
будет использоваться неявно.
поэтому, когда вы используете c.decode('ascii')
, вы а) имеете (закодированную) ByteString (вот почему вы используете декодирование), б) вы хотите получить объект представления юникода (именно для этого вы используете декодирование) иc) кодек, в котором закодирована ByteString, является ASCII.
См. также: https://stackoverflow.com/a/370199/1107807
http://docs.python.org/howto/unicode.html
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
http://www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror