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.
- Текст неправильно перекодовано кілька разів.
Рішення
- Вкажіть кодування:
open("file.txt", encoding="utf-8")абоencoding="cp1252"/"latin-1". - Визначте кодування: редактор (VS Code: праворуч унизу),
file -i file.txt, бібліотекаcharset-normalizer. - З BOM:
encoding="utf-8-sig". - Для двійкових даних відкривайте в режимі
"rb". - Як крайній захід замінюйте помилки:
errors="replace"або"ignore"(втрачає символи, лише якщо це допустимо). - Приведіть усе до 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