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