Отображение кириллицы в CLion
CLion по дефолту использует UTF-8 для хранения файлов с исходным кодом. Строка «Привет, Мир!» будет представлять собой последовательность (в файле с исходником):
D0 9F D1 80 D0 B8 D0 B2 D0 B5 D1 82 2C 20 D0 9C D0 B8 D1 80 21
Как видите, на 12 символов исходной строки, получили 21 байт (т.к. кириллические символы занимают больше одного байта).
Компилятор GCC по умолчанию читает исходники в кодировке UTF8 , если не указать другую через ключ -finput-charset . Таким образом эта последовательность байтов в неизменном виде сохранится в исполняемый файл.
При запуске программы на исполнение, CLion использует стандартный cmd.exe , который по умолчанию скорей всего у вас работает в кодировке CP866 . В которой наша последовательность байтов будет отображена как:
╨Я╤А╨╕╨▓╨╡╤В, ╨Ь╨╕╤А!
(что вы и видите в терминале CLion)
Что делать?
Вариант 1
Сменить кодировку файла на IBM866 (то же, что и CP866 ) (настройки — File Encodings) (сам файл перекодировать, если в нем уже был текст на русском). Теперь кириллица будет сохраняться в файле с исходным текстом в кодировке CP866 (один байт на символ), в том же виде попадать в исполняемый файл и нормально отображаться в консоли CLion. Разумеется, использовать CP866 в 19-м году, без особых на то оснований, некультурно. Кроме того придется ограничить себя символами из CP866 .
Вариант 2
Вставить в начало свой программы:
system("chcp 65001");
или (потребует #include ):
SetConsoleOutputCP(CP_UTF8);
Консоль переключится в UTF-8 , все будет отображаться как надо. Но только при использовании низкоуровневых операций вывода типа puts(«Привет, Мир!»); . Если выводить через std::cout , то возможен вывод типа ��ривет, Мир! . Это связано с тем, что функция Windows API для вывода в консоль ожидает увидеть в каждом вызове законченную строку. И если оператор basic_ostream::operator
Предостережение
При использовании UTF-8 в своей программе, например при хранении в std::string , следует помнить, что операции над строками могут дать не очевидные результаты (т.к. один символ теперь может занимать от 1 до 4 байтов).
Кроме вывода, аналогичные проблемы ожидают и при вводе из std::cin . Таким образом, единственным прозрачным решением для Windows (даже десятки), пока остается использование латиницы.
Clion как изменить язык консоли?
Как в clion изменить язык вывода в консоли ошибок? Гуглил, через настройки не помогает. Дело в том, что у меня в консоли англ. стоит, но вот я получаю ошибку:
error C2248: User::User: Ґў®§¬®¦® ®Ўа
но из-за кодировки я не могу получить нормальный текст. Кодировки я уже менял как хочешь (даже в clion64.exe.vmoptions) — не сильно помогло.. Думаю на английский изменю да и фиг с этой кириллицей.
А так я устанавливал для кодировки в
-Dconsole.encoding=windows-1251
-Dfile.encoding=windows-1251
и в настройках менял global encoding & для файла кодировку..
- Вопрос задан более двух лет назад
- 263 просмотра
Как настроить кодировку в clion, чтобы корректно отображался русский алфавит?

Здравствуйте! Не могу найти в интернете, как настроить кодировку, чтобы корректно выводить русские буквы в CLion. Прилагаю скриншот проблемы
- Вопрос задан более двух лет назад
- 6250 просмотров
1 комментарий
Простой 1 комментарий
Не знаю как задать кодировку консоли в CLion, наверняка как-то это делается.
Но советую вам запускайть программу в обычной консоли (cmd.exe).
Т.к. IDE обычно настраивают консоль под себя. А работать ваша программа будет вообще то без IDE. Поэтому не сильно интересно, чтоб программа корректно работала под IDE. Гораздо интереснее, чтоб программа работала нормально в обычной обстановке.
Еще могу сразу предупредить — в русской винде в консоли может быть 2 русских кодировки. По умолчанию используется cp866. Но командами консоли кодировку можно сменить на cp1251. Так же кодировку можно сменить и на UTF-8, но с ней многие команды не дружат, поэтому она практически не используется в консоли.
Если ваша программа будет осуществлять консольный ввод/вывод только в одной кодировке, то при переключении кодировки в консоли, ваша программа будет отрабатывать не корректно (так же как сейчас).
Ваш компилятор, сам язык и стандартная библиотека ничего не знают о кодировках консоли и ничего не делают специально, чтоб вывод был корректный. Т.е. выводится в консоль именно то, что вы написали в исходниках.
Можно писать программу так, что бы она корректно работала не зависимо от кодировок консоли. Но это несколько сложней обычного printf.
Как в clion поставить русский язык
Если программа при выводе на консоль использует кириллицу, то мы можем столкнуться с ситуацией, когда вместо кириллических символов будут отображаются непонятные знаки. Особенно это актуально для ОС Windows. И в этом случае необходимо явным образом задать текущую локаль (культуру) для вывода символов. В языке C++ это можно сделать с помощью встроенной функции setlocale() .
Итак, изменим код, который использовался в прошлых темах следующим образом:
#include int main()
Компиляция и запуск в ОС Windows может выглядеть следующим образом:
c:\cpp>g++ -std=c++20 -Wall -pedantic app.cpp -o app & app Р?С?РёР?РчС' Р?РёС?! c:\cpp>
Вместо ожидаемого текста я получаю какие-то непонятные символы. Теперь изменим код, применив функцию setlocale() :
#include int main()
Теперь для вывода данных на консоль вместо объекта std::cout применяется объект std::wcout , который предназначен для работы с символами Unicode. В данном случае предполагается, что кодировка самого файла — UTF-8. Кроме того, перед строкой указан символ L .
Повторно компилируем и запустим приложение:
c:\cpp>g++ -std=c++20 -Wall -pedantic app.cpp -o app & app Привет мир! c:\cpp>
На некоторых платформах, например, Ubuntu, мы можем не столкнуться с подобной проблемой. И в этом случае вызов функции setlocale просто не окажет никакого влияния.