@volersawns

Почему так происходит?

Исходный текст программы:
#include <iostream>
#include <string>
#include <clocale>

int main(int, char**)
{
    std::setlocale(LC_ALL, "Russian");
    std::wstring line = L"Здравствуй, мир!";
    std::wcout << line << std::endl;
    std::wcin >> line;
    std::wcout << line << std::endl;
    return 0;
}


1. Почему, если ввести "Привет", пишет кракозябры?
Здравствуй, мир!
Привет
?аЁў?в


2. Почему, если закомментировать строку
std::setlocale(LC_ALL, "Russian");
русские буквы не выводятся?
  • Вопрос задан
  • 180 просмотров
Решения вопроса 2
@alex-t
Прогр. в команде rco.ru
Ну вот так она (консоль в Винде) устроена... Правильный вывод 2-байтовых символов будет системным вызовом WriteConsoleW. Если захотите использовать вывод через потоки, придется написать свой. При этом, для большего развлечения, не забудьте учесть возможность перенаправления вывода программы в файл.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Потому что в консоли русской винды кодировка либо 866 либо 1251. А в программе у тебя используется Unicode. setlocal, судя по всему, действует только на вывод.
Чтоб поточному объекту установить нужную кодировку надо вызвать его метод imbue.
Смотри примеры:
www.cplusplus.com/reference/ios/ios/imbue
rsdn.ru/forum/cpp/4378529.all
stackoverflow.com/questions/26387054/how-can-i-use...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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