При запуске программы на C++ в терминал выводятся непонятные (неизвестные) символы?

Почему при выводе русского текста в терминал из программы на C++ (пишу в VSCode) вместо букв появляются непонятные/некорректные символы? (см. скриншот) <br/>
  • 5 июня 2026 г. 16:02
Ответы на вопрос 1
Коротко — потому что кодировка текста в исходнике/строке программы не совпадает с кодировкой/кодовой страницей терминала. В результате байты символов интерпретируются неправильно и вы видите «кракозябры».

Что проверить и как исправить (быстрое руководство)

1) Кодировка исходного файла
- Сохраните .cpp в UTF-8 (без BOM). В VSCode внизу правой кнопки строки состояния можно переключить кодировку файла. BOM (UTF‑8 with BOM) часто даёт лишние странные символы в начале вывода.

2) Кодировка/кодовая страница терминала
- Linux / WSL / macOS: убедитесь, что locale установлен на UTF‑8 (например LANG=ru_RU.UTF-8). Выполните в терминале `locale` и при необходимости экспортируйте LANG.
- Windows (cmd/PowerShell/интегрированный терминал VSCode): по умолчанию используется CP866 или CP1251, а не UTF‑8. Можно переключить на UTF‑8:
  - перед запуском: `chcp 65001`
  - или программно: вызвать SetConsoleOutputCP(CP_UTF8) (Windows API).
  - альтернативно — использовать Windows Terminal/PowerShell с поддержкой UTF‑8 или включить системный бета‑режим UTF‑8 в настройках региона Windows.

3) Использование в коде
- Если файл в UTF‑8, выводите UTF‑8 байты:
  - На Linux/WSL: `setlocale(LC_ALL, "")` (или конкретно "ru_RU.UTF-8") и `std::cout << u8"Привет\n";`
  - На Windows можно программно включить CP 65001:
    #include <windows.h>
    int main() {
      SetConsoleOutputCP(CP_UTF8);
      std::cout << u8"Привет, мир\n";
    }
- Альтернативный способ на Windows — использовать широкие строки и подключить режим вывода в UTF‑8:
    #include <io.h>
    #include <fcntl.h>
    #include <iostream>
    int main() {
      _setmode(_fileno(stdout), _O_U8TEXT);
      std::wcout << L"Привет, мир\n";
    }
  (этот способ переводит stdout в UTF‑16/UTF‑8 режим и использует wcout).

4) Шрифт терминала
- Шрифт должен поддерживать кириллицу (Consolas, DejaVu Sans Mono, Source Code Pro и т.п.).

5) Типичные признаки и причины
- Первые символы похожи на "" — это BOM (сохранён файл с BOM).
- Всё выводится «кракозябрами» — скорее всего терминал не в UTF‑8 и/или файл не в UTF‑8.

Примеры для быстрой проверки
- Linux/WSL:
  - убедиться, что файл сохранён в UTF‑8, затем:
    setlocale(LC_ALL, "");
    std::cout << u8"Привет\n";
- Windows (быстрый старт):
  - в коде: SetConsoleOutputCP(CP_UTF8);
  - в терминале: chcp 65001

Если хотите — пришлите:
- пример программы,
- как вы запускаете (cmd/PowerShell/WSL/терминал VSCode),
- вывод команды locale (или chcp),
и я подскажу точные команды/исправления.
Похожие вопросы