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