Python WindowsLinuxmacOSPython 3

Python: После смены кодировки консоли выводятся неправильные символы

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

После изменения кодировки консоли русские сообщения Python могут отображаться неправильно, хотя строки в памяти остаются корректными: важны кодировка вывода, поддержка терминалом UTF-8 и способ перенаправления в файл.

В этой статье
  1. Что произошло и когда проявляется ошибка
  2. Причины и диагностические признаки
  3. Подробная пошаговая диагностика и исправление
  4. Как проверить, что проблема устранена
  5. Если исправление не помогло

#Что произошло и когда проявляется ошибка

После изменения кодировки консоли русские сообщения Python могут отображаться неправильно, хотя строки в памяти остаются корректными: важны кодировка вывода, поддержка терминалом UTF-8 и способ перенаправления в файл.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Кодовая страница терминала не совпадаетБайты вывода интерпретируются как другая кодовая страница.Русские буквы превращаются в псевдографику только в cmd.exeПроверить кодировку потока и терминала.
Данные были испорчены ещё при чтении файлаИспользована неверная encoding при открытии источника.Символы неверны и в редакторе, и в логахИсправлять декодирование файла, не вывод терминала.
Перенаправление меняет кодировку выводаОкружение может выбирать другую кодировку потока при записи в файл.В терминале всё хорошо, в > out.txt символы неверныЯвно задавать encoding для файлового вывода.

#Подробная пошаговая диагностика и исправление

  1. 1. Определите, испорчены ли сами данныеСоздайте в редакторе UTF-8 файл check_console.py с примером ниже. Запустите его в том же терминале, где наблюдается ошибка. repr показывает представление строки, sys.stdout.encoding — реальную кодировку стандартного вывода. Если ошибка наблюдается только при печати, не перекодируйте все исходные файлы.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    import sys
    s = "Привет, мир!"
    print(repr(s))
    print("Кодировка вывода:", sys.stdout.encoding)
    print(s)
  1. 2. На Windows проверьте кодовую страницуОткройте Windows Terminal или PowerShell. Для старого cmd.exe выполните chcp: команда покажет номер кодовой страницы; при необходимости временно установите 65001 для UTF-8 в этом окне и снова запустите тест. Это не исправит файл, который уже был прочитан неверно.
    Windows · Командная строка (CMD)Команда
    В командной строке Windows; chcp 65001 действует на текущий сеанс, повышенные права не нужны.
    chcp
    chcp 65001
    python check_console.py
  1. 3. Для повторяемого запуска задайте UTF-8 окружению PythonВ Windows PowerShell перед запуском проверочного скрипта задайте $env:PYTHONIOENCODING="utf-8". В Linux/macOS обычно достаточно терминала UTF-8; перед установкой переменных проверьте кодировку локали. Переменная применяется к новому процессу Python, не ко всем уже запущенным программам.
  2. Только PowerShell Windows и текущий сеанс; не выполняйте эту строку в cmd.exe
    Windows · PowerShellКоманда
    Только PowerShell Windows и текущий сеанс; не выполняйте эту строку в cmd.exe.
    $env:PYTHONIOENCODING = "utf-8"
    python .\check_console.py
  1. 4. Для файла укажите кодировку явноНе полагайтесь на перенаправление stdout, если файл результата нужно передавать другим приложениям. Вместо print(... ) > result.txt сохраните текст через open(..., encoding="utf-8") в новый файл; перед заменой существующего проверьте его в редакторе UTF-8.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    from pathlib import Path
    Path("result-new.txt").write_text("Привет, мир!\n", encoding="utf-8")
  1. 5. Проверьте и верните настройки сеансаПовторите тест в рабочем терминале и в среде реального запуска. Если в cmd.exe меняли кодовую страницу, откройте новое окно для возврата к исходным настройкам. Если файл раньше содержал испорченные байты, создайте его заново из корректного источника.

#Как проверить, что проблема устранена

Проверочный Привет, мир! читается в терминале и в файле; stdout.encoding соответствует ожиданиям, исходные файлы не перекодировались без нужды.

#Если исправление не помогло

Если repr содержит уже испорченные символы, проверяйте open(..., encoding=...) при чтении источника. В контейнерах и службах кодировка может отличаться от интерактивного терминала.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.