Как сделать ввод русского текста через оператор std::cin нормальным и без крякозябр?
Решил перевести из англа на русский перевести консольную игру "Словомеска" по книге "Изучаем С++ через программирование игр", проблема в вводимых словах, которые почему преобразуюся в крякозябры (когда смотрел пошагово), что не так с кодировками и есть ли простое решение
// Word Jumble
// The classic word jumble game where the player can ask for a hint
#include
#include
#include
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
enum fields { WORD, HINT, NUM_FIELDS };
const int NUM_WORDS = 5;
const string WORDS[NUM_WORDS][NUM_FIELDS] =
{
{"стена", "Они тебя окружают и защищают, по крайней мера одна она из этих сестер, что служат дому опорами.."},
{"стекло", "Сквозь нее ты смотришь, но он не пропускает холод улиц.."},
{"собака", "Лает, кусает, в дом не пускает.."},
{"желания", "Причина всех твоих страдании.."},
{"правда", "В отличии от лжи, она таааак горька..."}
};
srand(static_cast(time(0)));
int choice = (rand() % NUM_WORDS);
string theWord = WORDS[choice][WORD]; // word to guess
string theHint = WORDS[choice][HINT]; // hint for word
string jumble = theWord; // jumbled version of word
int length = jumble.size();
for (int i = 0; i < length; ++i)
{
int index1 = (rand() % length);
int index2 = (rand() % length);
char temp = jumble[index1];
jumble[index1] = jumble[index2];
jumble[index2] = temp;
}
cout << "\t\t\tДобро пожаловать в игру \"Словомеска\"\n\n";
cout << "Угадай все буквы, чтобы сложилось слово\n";
cout << "Введи 'hint' для получения маленького намека :) .\n";
cout << "Введи 'quit' чтобы покинуть нас :( .\n\n";
cout << "Зашифрованное слово: " << jumble;
Валерий Гайсин, "допустим игры" вы будете писать на движках, умеющих работать с уникодом, а не с консольным вводом-выводом, который в виндах сделан через CP866 ради совместимости с легаси.
Если делать по уму, то вам нужно:
1.Исходники сохранять в UTF8. Для строк и строковых констант использовать wchar_t или wstring.
2.При старте программы узнайте кодировку консоли
3.Перед выводом строк на экран преобразуйте ваши широкие строки в кодировку консоли и только после этого выводите. Для
В винде 2 русских кодировки консоли: cp1251 и cp866, при чем cp866 используется по умолчанию. Менять кодировку консоли можно из самой консоли командой chcp. Менять кодировку консоли из программы - дурной тон.
Пример конвертации с помощью WinAPI можете посмотреть тут.
Валерий Гайсин, В любом редакторе, умеющем перекодировать текст, например Notepad++.
Можно через студию с помощью диалога File->SaveAs, там есть возможность установить кодовую страницу сохраняемого файла.
Так же есть опция Tools->Options->Environment->Documents->Save document as UNICODE ...
и Tools->Options->Text Editor->Auto-detect UTF-8 ...
Кроме того есть опция компилятора: /source-charset и /execution-charset.
В целом в студии как-то все не однозначно с кодировками.
На самом деле у меня не было проблем с UTF8 в студии, я всегда пишу исходники в UTF8 и при выставлении в свойствах проекта опции General->Character set->Use Unicode character set все собирается нормально. Редактор так же корректно распознает UTF8 в существующих исходниках по умолчанию.
Тут функции WinAPI для работы с консолью. Чтоб узнать текущую кодировку консоли вам нужна GetConsoleCP() :)