1

Изначально файл программы набирался в Notepad++(по умолчанию utf-8). Много разрозненного русского текста. При работе через MINGW64 русский выводился без проблем. При использовании файлов в Visual Studio 2017 вылезли непонятные символы.

    #include <Windows.h>

    SetConsoleOutputCP(CP_1251);

меняет тип кодировки, но кракозябры не исчезают...

#include <clocale>

setlocale(LC_CTYPE, "rus");

ничего не поменял.

Кусочек кода из программы:

cout << "Укажите количество датчиков для внесения в базу данных, " <<
"либо 0 для выхода.\n";

Как исправить ситуацию, не переписывая русский текст?

2 Answers2

1

Проверьте шрифт в консоли на поддержику кирилицы/UTF8. (ПКМ по окну консоли — шрифты) Так, как ваш код отлично работает на моем ПК.

Как другой вариант попробуйте использувать SetConsoleOutputCP(CP_UTF8)

(код взят из ответа на похожий вопрос):

#include <iostream>
#include <Windows.h>

int main() {
    SetConsoleOutputCP(CP_UTF8);
    std::cout << u8"Greek: αβγδ\n Привет!\n" << std::flush;
    getchar();
    return 0;
}
Jeidoz
  • 124
  • Эх, это не мой код был в примере(( Сейчас добавлю кусочек моего русского кода – Jane_Brown Mar 21 '19 at 18:40
  • В самой консоли 3 шрифта имеется: Consolas, Lucida console и точечный шрифт. Ни один не приводит к положительному результату. К сожалению... – Jane_Brown Mar 21 '19 at 18:54
  • 1
    Но вы же не полностью применили решение по ссылке. Не хватает вызова setvbuf, он в данном случае важен. – MSDN.WhiteKnight Mar 21 '19 at 18:57
  • В приведенной ссылке указан код: #include #include #include <Windows.h>

    class MBuf : public std::stringbuf { public: int sync() { fputs(str().c_str(), stdout); str(""); return 0; } };

    int main (int argc, char* argv[]) { SetConsoleOutputCP(CP_UTF8); setvbuf(stdout, nullptr, _IONBF, 0); MBuf buf; std::cout.rdbuf(&buf); std::cout << u8"Greek: αβγδ\n" << std::flush; Этот код сработал!!

    – Jane_Brown Mar 21 '19 at 19:10
0

Ваш код неправильно использует setlocale. Для UTF8 должно быть так:

setlocale(LC_ALL, "ru_RU.utf8");   

Кроме того, строковые литералы нужно явно объявить как UTF8:

cout << u8"Укажите количество датчиков для внесения в базу данных, ";

При соблюдении этих условий, русский (и только русский) текст в консоль выводится будет (но считываться через cin все равно не будет). Если хотите полноценно работать с Unicode в Visual Studio, перейдите на широкие символы, как описано здесь: Русский язык в консоли