Давайте внимательно рассмотрим это сообщение об ошибке:
"UnicodeDecodeError: кодек 'utf8' не может декодировать байты в позиции 8-13: неподдерживаемый диапазон кода Unicode"
Обратите внимание, что оноговорит "байты в позиции 8-13" - это 6-байтовая последовательность UTF-8 .Это могло бы быть допустимо в темные века, но , поскольку Unicode был заморожен на 21 бит, максимум - ЧЕТЫРЕ байта .Проверки UTF-8 и сообщения об ошибках недавно были ужесточены ;Интересно, какую именно версию Python вы используете?
По крайней мере, с 2.7.1 и 2.6.6 эта ошибка становится более полезной "... невозможно декодировать байт XXXX в позиции8: недопустимый начальный байт ", где XXXX может быть только 0xfc или 0xfd, если старое сообщение предлагало 6-байтовую последовательность.В ISO-8859-1 или cp1252 значение 0xfc обозначает малую букву U + 00FC U с диаэрезом (он же u-umlaut, вероятный подозреваемый);0xfd представляет U + 00FD LATIN МАЛЕНЬКОЕ ПИСЬМО Y С ОСТРОМ (менее вероятно).
Проблема НЕ в выражении if line.startswith(u"Fußnote"):
в исходном файле.Вы бы получили сообщение во время COMPILE, если бы оно не было надлежащим UTF-8, и сообщение начиналось бы с «SyntaxError», а не «UnicodeDecodeError».В любом случае код UTF-8 для этой строки имеет длину всего 8 байтов, а не 14.
Проблема в том, на что ссылается @Mark Tolonen, в любой «строке», на которую ссылается.Это может быть только объект str.
Чтобы получить дальнейшие сведения, вам нужно ответить на вопросы Марка (1) о результате изменения print repr(line)
(2) site.py
.
На данном этапе этохорошая идея прояснить вопрос о смешивании объектов str
и unicode
(во многих операциях, а не только a.startswith(b)
).
Если операция не определена для создания объекта str
,он НЕ приведёт объект unicode
к str
. Это не относится к a.startswith(b)
. Он попытается декодировать объект str
, используя кодировку по умолчанию (обычно 'ascii').
Примеры:
>>> "\xff".startswith(u"\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
>>> u"\xff".startswith("\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)
Кроме того, Неверно говорить «Смешайте и вы получите UnicodeDecodeError». Вполне возможно, что объект str
правильно закодированв кодировке по умолчанию (обычно 'ascii') - исключение не возникает.
Примеры:
>>> "abc".startswith(u"\xff")
False
>>> u"\xff".startswith("abc")
False
>>>