@immelnikoff
Изучаю БД

Как решить проблему 'utf-8' codec can't decode byte 0xf6 in position 3539: invalid start byte?

Считываю файл и перебираю все строки в нём:
fin = open(r'D:\Mega DataBase 2023\pgn\game1.pgn', 'r', encoding='utf-8-sig')
cnt = 0
for row in fin:
    cnt += 1

Возникает ошибка:
UnicodeDecodeError                        Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_8508\626924785.py in <module>
      1 tmp_row = None
      2 cnt = 0
----> 3 for row in fin:
      4     cnt += 1

C:\ProgramData\Anaconda3\lib\codecs.py in decode(self, input, final)
    320         # decode input (taking the buffer into account)
    321         data = self.buffer + input
--> 322         (result, consumed) = self._buffer_decode(data, self.errors, final)
    323         # keep undecoded input until the next call
    324         self.buffer = data[consumed:]

C:\ProgramData\Anaconda3\lib\encodings\utf_8_sig.py in _buffer_decode(self, input, errors, final)
     67                        codecs.utf_8_decode(input[3:], errors, final)
     68                     return (output, consumed+3)
---> 69         return codecs.utf_8_decode(input, errors, final)
     70 
     71     def reset(self):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 3539: invalid start byte

Иду смотреть байт на позиции 3539 (0xDD3) и вижу, что он не равен 0xf6:
64500361a8a85818957634.png
Почему? Я не так смотрю?
Далее, python сообщает мне, что байт 0xf6 – invalid start byte. Но, 0xf6 = 0b11110110, то есть это как раз валидный стартовый байт в utf-8 для 4-байтных символов (см. Wikipedia).
Опять непонятки... Это python вводим меня в заблуждение или я чего-то не понимаю?

PS. Читаемый файл закодирован в кодировке utf-8(BOM), так как начинается с BOM: EF BB BF.
Перебор кодировок в open() проблему не решил.

Проблема решена:
Нашёл байт 0xf6 и 3 байта, следующие за ним:
f6 77 2c 0d = 11110110 01110111 00101100 00001101
Видно, что эта последовательность не валидна для utf-8.
b'\xf6\x77\x2c\x0d'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte

Оказалось, что файл закодирован кодировкой latin-1 (она же iso-8859-1):
b'\xf6\x77\x2c\x0d'.decode('latin-1')
'öw,\r'
  • Вопрос задан
  • 530 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Возможно ты не так интерпретируешь смысл ошибки
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 3539: invalid start byte

Что это за позиция 3539? Внутри строки? Файла? Или блока utf-декодера?

Поищи просто 0xf6 внутри файла и посмотри какие байты были до него и после.
Префикс в четыре единичных бита предполагает следующий паттерн
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
и надо это проверить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы