EMZETT.
Войти

UnicodeDecodeError (Python) и кракозябры

Коротко: Python не может прочитать байты как текст, потому что у файла другая кодировка символов, чем предполагалось.

Подробнее: Сообщение: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 12: invalid continuation byte или в Windows 'charmap' codec can't decode byte …. Текст состоит из байтов; кодировка определяет, каким символам соответствуют какие байты. Если предполагаемая не совпадает с фактической, возникает эта ошибка или кракозябры («Ã¤» вместо «ä»).

Подробности

Причины

  • Файл в Latin-1/Windows-1252 (например, из старого Excel или Windows), а Python ожидает UTF-8.
  • В Windows кодировка open() по умолчанию часто cp1252, а не UTF-8.
  • Двоичные данные (изображения, ZIP) читаются как текст.
  • Файл UTF-8 с BOM (маркер порядка байтов) или UTF-16.
  • Текст неверно перекодирован несколько раз.

Решения

  1. Укажите кодировку: open("file.txt", encoding="utf-8") или encoding="cp1252" / "latin-1".
  2. Определите кодировку: редактор (VS Code: справа внизу), file -i file.txt, библиотека charset-normalizer.
  3. С BOM: encoding="utf-8-sig".
  4. Для двоичных данных открывайте в режиме "rb".
  5. В крайнем случае заменяйте ошибки: errors="replace" или "ignore" (теряет символы, только если это допустимо).
  6. Приведите всё к UTF-8, сохраняйте файлы как UTF-8 и задавайте <meta charset="utf-8"> в HTML. Для CSV из Excel: выберите «CSV UTF-8» или читайте как cp1252.

Исправление кракозябр

Типичная картина: текст UTF-8 прочитан как Latin-1. Обратный путь в Python: text.encode("latin-1").decode("utf-8"). Помогает библиотека ftfy. Всегда проверяйте на примерах, потому что многократные неверные кодировки сложнее.

См. также: ASCII и наборы символов, UTF-8 и кодировка символов, ModuleNotFoundError