Проблема при работе с русскими символами (wchar_t)
Я пытаюсь создать ассоциативный массив с русскими символами в качестве ключей.
Например, мы вводим символ из консоли и хотим по нему найти поле в массиве. Однако, при попытке обнаружить символ 'б', считанный из стандартного потока при помощи wcin, мы получим 0. Но при поиске по L'б' мы получаем успешный результат (т.е. "ББББ").
#include <iostream>
#include <map>
using namespace std;
int main(){
wchar_t c;
map<wchar_t, const char*> alphabet = {
{L'а', "АААА"},
{L'б', "ББББ"}
};
wcin >> c; //Введем символ 'б'
cout << alphabet.find(c) -> second << endl; //Напечатает: 0
cout << alphabet.find(L'б') -> second << endl; //Напечатает: ББББ
return 0;
}
Я пробовал заменить wcin на wscanf(L"%lc", &c), но это не принесло результата.
Помимо этого, я попробовал привести переменную c и символ L'б' к int и вот что получил:
cout << static_cast<int>(c) << " " << static_cast<int>(L'б') << endl;
//Вывод: 208 1073
Файл сохранен в UTF-8. В терминале установлена та же самая кодировка.
Операционная система Mac OS, компилятор g++.
Ответы (2 шт):
#include <iostream>
#include <map>
using namespace std;
int main(){
setlocale(LC_ALL, "Rus");
//дальше код, та строка меняет на кодировку на русскую
}
Насколько я понял нужно просто установить русскую кодировку. Кстати можешь на ютубе найти канал SimpleCode. Там есть очень подробные уроки по C++, а также сейчас регулярно выходят уроки по C#.
Использовать можно потоки cout XOR wcout - одновременно они конфликтуют. Задавать нужно локаль. Буквы вы записали в char чтобы выводить в cout. Так как нужно выводить только в wcout, тогда нужно выводить L"АААА". Не забывать нужно проверять успешность поиска в map. Со всеми исправлениями вот что получилось:
// g++ -Wall -std=c++11 wcin.cpp -o wcin
#include <iostream>
#include <map>
#include <locale>
using namespace std;
int main(){
setlocale(LC_ALL,"");
wchar_t c;
map<wchar_t, const wchar_t * > alphabet = {
{L'а', L"АААА"},
{L'б', L"ББББ"}
};
wcin >> c; //Введем символ 'а'
auto it = alphabet.find(c);
if(it == alphabet.end())
wcout << L"1.Записи нет\n";
else
wcout << it -> second << endl; //Напечатает: АААА
it = alphabet.find(L'б');
if(it == alphabet.end())
wcout << L"2.Записи нет\n";
else
wcout << it -> second << endl; //Напечатает: ББББ
return 0;
}