Коротко — потому что кодировка текста в исходнике/строке программы не совпадает с кодировкой/кодовой страницей терминала. В результате байты символов интерпретируются неправильно и вы видите «кракозябры».
Что проверить и как исправить (быстрое руководство)
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),
и я подскажу точные команды/исправления.