none
Не могу включить вывод кириллицы в консольном приложении C++ в MS VS 2017 Community. RRS feed

  • Вопрос

  • Здравствуйте. По моему это тот раздел форумов, который мне и нужен.

    У меня проблема - не могу включить кириллицу в консольном приложении C++, вместо русских букв выводятся знаки вопроса. Разрабатываю в Visual Studio 2017 Community в ОС Windows 10. И ОС и студия регулярно получают обновления. ОС - английская. Студия тоже английская. Так нужно. По поводу включения кириллицы переворошил кучу информации в различных формумах, например здесь: https://stackoverflow.com/questions/2492077/output-unicode-strings-in-windows-console-app , здесь: https://stackoverflow.com/questions/2261496/how-to-write-cyrillic-text-in-c-console и ещё во многих. Вот, например, тут у Майкла Каплана http://archives.miloush.net/michkap/archive/2008/03/18/8306597.html несколько непонятно, но я его смотрел последним, перед тем как сюда обратиться - может устал немножко. Вобщем, ничего не помогло. Сижу сегодня с 8 утра, а сейчас уже 13:25 - светлый день. Помогите, подскажите, кто-нибудь. Ведь наверняка есть же люди, которые тоже с этим сталкивались и решили проблему. Пожалуйста.


Ответы

  • Включил заголовочник pch.h первым и вывод кириллицы заработал.

    #include "pch.h"
    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <iostream>
    Большое спасибо за помощь и поддержку.


    • Помечено в качестве ответа Purple_Apple 28 мая 2019 г. 14:31
    • Изменено Purple_Apple 28 мая 2019 г. 14:40

Все ответы

  • Обсуждалось миллионы раз. Совет использовать _setmode(_fileno(stdout), _O_U16TEXT); и широкие символы корректен, это должно решить проблему; хотя разумеется, есть и другие варианты. Если это не работает, возможно у вас в консоли установлен шрифт, не поддерживающий кириллицу. Попробуйте установить Lucida Console или Consolas. Другой вариант (если речь о литералах) - сами исходники в неправильной кодировке; обычно рекомендуется UTF8.

    Подробный обзор разных способов работы с кириллицей и возможных проблем см. например здесь: https://ru.stackoverflow.com/q/459154/240512


    • Изменено VadimTagil 28 мая 2019 г. 10:41
  • Привет, Вадим. Спасибо за поддержку. В частности с _setmode у меня проблемы. При компиляции, студия ругается на строку:

    int res1 = _setmode(_fileno(stdout), _O_U16TEXT);

    следующим образом:

    error C2065: '_O_U16TEXT': undeclared identifier

    error C3861: '_setmode': identifier not found

    А делаю я это примерно вот так:

         .
         .
         .
    #include <io.h>
    #include <fcntl.h>
         .
         .
         .
    
    int wmain(int argc, wchar_t* argv[], wchar_t* envp[])
    {
    	setlocale(LC_ALL, "Russian");
    	int res1 = _setmode(_fileno(stdout), _O_U16TEXT);
                       .   
                       .
                       .
    }
    Вот эту ошибку тоже бы как-нибудь исправить. Если можете, то помогите, пожалуйста.

    В настройках проекта (в Character Set'e) у меня установлено: Use Unicode Character Set.
  • У вас не хватает включения stdio.h для символа stdout. Также, вызов setlocale в данном случае не нужен: режим UTF16 не привязан к локалям. 

    "В настройках проекта (в Character Set'e) у меня установлено: Use Unicode Character Set."

    Это прекрасно, но не влияет на консольный вывод (это влияет на развертку обобщенных макросов типа TCHAR).

  • stdio.h у меня сейчас включён, но тем не менее ошибки

    error C2065: '_O_U16TEXT': undeclared identifier

    error C3861: '_setmode': identifier not found

    продолжают выводится при компиляции.

    setlocale - убрал.

    Заголовочники идут в следующем порядке:

    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <iostream>
    

    А под ними - уже мои собственные заголовочники. Например:

    #include "DelaunayTriangulation.h"
    Почему же _setmode капризничает?

  • Если честно - не знаю. Больше похоже на проблему со студией, чем с вашим кодом. Тот код, который вы показываете, определенно должен собираться. 
  • Включил заголовочник pch.h первым и вывод кириллицы заработал.

    #include "pch.h"
    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <iostream>
    Большое спасибо за помощь и поддержку.


    • Помечено в качестве ответа Purple_Apple 28 мая 2019 г. 14:31
    • Изменено Purple_Apple 28 мая 2019 г. 14:40