@Mars36

Как использовать юникод в консоли windows с wstring?

Пробовал самые популярные вариант.
На данный момент прогресс остановился на таком моменте:
system( "chcp 65001" );
    _setmode( _fileno( stdout ), _O_U8TEXT );
    _setmode( _fileno( stdin ), _O_U8TEXT );
    std::wcout << L"строка" << std::endl;
    std::wcout << L"string" << std::endl;
    std::wstring test;
    std::wcout << L"input: ";
    std::wcin >> test;
    std::wcout << test << std::endl;

Получаемый вывод:
Active code page: 65001
строка
string
input: строка

Press <RETURN> to close this window...

Т.е. первые два варианта отрабатывают нормально, но в случае ввода в консоль получаются неизвестные символы.
60cc7bfa737da157285127.png
Как это можно исправить?
Так же как можно решить проблему с тем, что программа принимает аргументы командной строки, которая по умолчанию в 866 и символы в любом случае будут приходить в этой кодировке и сменой кодировки во время выполнения проблему не решить?
  • Вопрос задан
  • 862 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
Аргументы командной строки не обязательно будут в 866 кодировке, могут быть и в 1251 - зависит от кодировки консоли, которую можно менять консольной командой chcp.
Вообще не стоит использовать юникод в консоли, т.к. виндовая консоль не слишком дружит с юникодом.
Например, если захотите обработать вывод вашей программы каким-нибудь фильтром в батнике, то при юникоде могут быть проблеммы.
Хотя внутри программы вы можете использовать юникод, но в этом случае вы должны будете перекодировать весь ввод и вывод. Не уверен, можно ли настроить стандартную библиотеку, чтобы она сама занималась перекодировкой.
А так в WinAPI есть целый набор консольных функций, в т.ч. можно получить текущую кодировку консоли для ввода и вывода, установить нужную кодировку, перекодировать текст.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы