3

Здравствуйте. В прошлом году взялся за изучение C++. Для этого дела использовал Microsoft Visual Studio Express. После новогодних праздников решил продолжить изучение языка (за это время успел переустановить ОС). По быстрому поставил себе компилятор g++ и IDE Geany. Для проверки корректной работы моих новых инструментов, решил набрать простую программу.

#include <iostream>;
#include <cstdlib>;
#include <windows.h>;
using namespace std;
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    cout << "Привет, мир!\n";
    system("pause");
    return(0);
}

И на тебе, кириллица в консоле не вывелась:

img

В Visual Studio всё работало. В чём проблема?

3
  • Клюцни правой кнопкой на консоль-> заходиш в свойства->вкладку шрифт ->и меняеш ево на Сonsolas либо на иной другой.
    – Staffer
    20 апр 2018 в 21:10
  • блин немного не успел
    – Staffer
    20 апр 2018 в 21:12
  • Что вы не успели? А что такое - "клюцни"?
    – 0xdb
    20 апр 2018 в 21:31

2 ответа 2

3

Вместо редактировать нажал удалить, сорри.

Варианта три

  • Не компилируется - SetConsole* MS функции не обязательно будут поддерживаться другим компилятором.
  • Если эти функции имеются в библиотеке идущей с компилятором, не обязательно будут обеспечивать то же поведение программы.

Вообще эти два варианта справедливы для любых не входящих в стандарт функций.

  • SetConsole* воздействует только на Unicode шрифты, поэтому необходимо задать в консоли для отображению именно такой шрифт (обычно Lucida Console)
4
  • IMHO gcc/g++ не используют в своих библиотеках аналоги функций MS, а вызывают их непосредственно из системных библиотек. Поскольку программа слинковалась (и отработала), то варианты 1 и 2 можно сразу отбросить. -- Ответ про шрифт правильный. -- В русской семерке есть (по крайней мере у меня) еще один "глюк". После установки надо войти в "панель управления"->"язык и региональные стандарты"->"дополнительно" и в пункте "текущий язык программ, не поддерживающих Юникод" 2 раза изменить язык. Первый раз на любой, потом перезагрузиться и заменить на русский. Потом работает.
    – avp
    3 янв 2013 в 16:37
  • если программа слинковалась - не позволяет отбросить пункт 2, и там "унутре" может реализовываться очень разное поведение от вызова системных функций или собственной реализации, до например какого-либо макроса. Я занудничаю, потому что не люблю такие функции и обычно не рекомендую их использовать.
    – Mirdin
    3 янв 2013 в 17:27
  • @Mirdin, а Вы просто посмотрите в /MinGW/include wincon.h:183:BOOL WINAPI SetConsoleOutputCP(UINT); и все станет более понятно.
    – avp
    3 янв 2013 в 18:13
  • @avp я ими не пользовался фиг знает сколько времени, и сомнительно что воспользуюсь в ближайшем будущем. Понадобиться - посмотрю, а так...
    – Mirdin
    3 янв 2013 в 18:18
1

Насколько я понимаю, функция SetConsoleOutputCP(1251) прекрасно работает и переводит консоль в кодировку 1251, однако исходный код сохранён в UTF-8. Решение: в текстовом редакторе (настройках IDE) выбрать кодировку Windows-1251.

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.