@Wolnerlol

Почему не считывает русскую букву в char?

Хочу чтоб при вводе русской буквы "о" выводилось в консоль "111", с английским буквами все работает, а с русскими - нет.

Мой код
#include <iostream>
#include <string>
#include <map>
#include <cctype>
using namespace std;

map <char, string> morze = {
    	{ 'о', "111"},

};

int main() {
	string text;

	while(cin >> text) {
	    for(int i = 0; i < text.length(); i++) {
	    	text[i] = tolower(text[i]);
	    	cout << morze.find( text[i] )->second <<"  ";
	    }

	}

	return 0;
}
  • Вопрос задан
  • 365 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
При работе с языками в консоли обычно возникают следующие вопросы.
1) Консоль. Какая кодировка по умолчанию для однобайтных символов. Смотри команду.
chcp для windows или
$ locale для linux.
2) Какая кодировка указана для char для текущего компиллятора. Включен ли режим _UNICIDE.
Посмотри что делают
setLocale(...);
 setCodepage(...);

3) Какой размер символа sizeof(char).
4) В какой кодировке написан исходник. Это можно проверить если посмотреть hex редактором. Там где русская буква может быть например 0xC0 для однобайтной и двух байтной для Unicode.
5) Установлены ли шрифты? Операционка может быть англо-язычной и в этом случае она не обязата что-то специфичное отображать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Если программа выполняется под виндой, то:
1. В консоли винды по умолчанию кодировка cp866 (да же не cp1251 и тем более не unicode). Кодировка консоли в винде может быть легко изменена с помощью команды консоли chcp, так что полагаться на то, что в консоли будет всегда одна и та же кодировка не стоит. Когда вы читаете символ с консоли, то он появляется в программе в кодировке консоли.
2. Еще у вас есть кодировка файла исходного кода. Компилятор сам ничего не перекодирует. В какой кодировке написаны ваши константы в исходниках в той они и будут в программе. Когда вы выполняете операцию сравнения, то символ в кодировке файла исходного кода сравнивается с символом в кодировке консоли. Если обе кодировки не совпадают - сравнение будет не удачным, даже если символ один и тот же.
3. Простой вариант - писать исходники в cp866 и не менять кодировку консоли в тестах. Может не работать, если, например, запускаете программу из MSVC - IDE может сама менять кодировку своей отладочной консоли. Лучше тесты запускать вручную в отдельном консольном окне.
4. Правильный вариант - исходники писать в UTF8, символьные и строковые константы писать как wide char (wchar_t, в винде это UTF-16) перед вводом узнать кодировку консоли, перекодировать введенные символы в UTF-16, сравнивать символы в UTF-16. С выводом в консоль - та же история. В WinAPI есть функции перекодировки из многобайтных (cp866/1251, ...) в широкие символы и обратно.

В линуксе сейчас повсеместно консоль в unicode, соответственно и читать вам надо unicode и сравнивать с unicode.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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