Сравнение кириллических строк не работает

Программа должна проверить на истинность ввод строки. Не могу понять почему проверочное условие в операторе if не выполняется. Помогите пожалуйста :)

#include <iostream>
#include <string>

int main(void)
{
    using namespace std;

    cout << "Enter a month: ";
    string month;
    cin >> month;
    if (month == "февраль")
        cout << "Right!!!";
    else
        cout << "Wrong :(";
    Console::ReadLine();
    return 0;
}

Так сработает:

#include <iostream>
#include <string>

int main(void)
{
    using namespace std;

    cout << "Enter a month: ";
    string month;
    cin >> month;
    if (month == "february")
        cout << "Right!!!";
    else
        cout << "Wrong :(";
    Console::ReadLine();
    return 0;
}

или так:

#include <iostream>
#include <string>
#include <windows.h>

const int BUFSIZE = 256;
char buf[BUFSIZE];

int main(void)
{
    using namespace std;

    cout << "Enter a month: ";
    string month;
    cin >> month;
    OemToCharBuff(month.c_str(), &buf[0], BUFSIZE);
    month = buf;
    if (month == "февраль")
        cout << "Right!!!";
    else
        cout << "Wrong :(";
   return 0;
}

При консольном вводе символы кириллицы попадают в программу в кодировке cp866, а литерал в программе, как правило, в кодировке windows-1251. Поэтому оно и не совпадает. Надо либо отказаться от кириллицы, либо приводить кириллицу к единой кодировке (в данном случае к windows-1251).

«Линупс» здесь ни при чём )) Просто кодировки сравниваемых строк должны совпадать. И касается это не только национальных символов, и не только консольного ввода. Я посмотрю, как ты под хвалёным линухом будешь сравнивать строку в EBCDIC (допустим, считанной из файла) со строкой в KOI-8 )))

Кстати, в MS Visual Studio есть элементарная возможность писать консольные программы без танцев с бубном в виде setlocale() и всяких там OemToCharBuffA(): надо просто сказать редактору IDE, что бы он сохранял файлы в кодировке 866. И всё. Ввод, вывод, сравнение строк с кириллицей — никаких проблем.

А если IDE/редактор не поддерживает работу с различными кодировками — значит надо менять IDE/редактор. Или танцевать под ритмичный аккомпанемент бубна.

Суть в том, что cmd.exe использует богомерзкую кодировку cp866, сохранять файлы в которой, у нормального человека нет никакого желания.

Если нужно сравнить две строки в заведомо разных кодировках, то это уже совсем другой разговор. Почти всегда, такие задачи решаются просто, с помощью iconv.

cmd.exe использует богомерзкую кодировку cp866

Вопрос религии. Мне, например, KOI8-R — ну не в пень. А сталкиваться время от времени приходится.

Если нужно сравнить две строки в заведомо разных кодировках, то это уже совсем другой разговор.

Почему «другой разговор»? В контексте данного топика — тоже есть две строки в заведомо разных кодировках. Другой вопрос, что об этом не все догадываются ))

Если бы в венде везде использовался юникод, этой проблемы бы не возникло вообще.

А то, что сейчас там cp866, так это уже не религия. Секта какая-то :)

При нынешнем положении вещей, самый простой выход — не использовать кириллицу в коде, если пишешь что-то консольное.

Конечно, фигня, мягко выражаясь (( За столько лет M$ уж могли бы, если не отказаться от cp866, учитывая соображения обратной совместимости, то хотя бы допилить консоль так, что бы она понимала различные кодировки, или была бы настраиваемой.

А вот отказаться от кириллицы при написании консольных приложений — выплеснуть ребёнка вместе с водой. Что из этого получается — примеров множество:

cout << "VvediTe 4isJIo : ";

Что из этого получается — примеров множество:

Ну, и заодно подучить базовый английский. Транслитом, конечно писать не стоит.

Кстати, в MS Visual Studio есть элементарная возможность писать консольные программы без танцев с бубном в виде setlocale() и всяких там OemToCharBuffA(): надо просто сказать редактору IDE, что бы он сохранял файлы в кодировке 866. И всё. Ввод, вывод, сравнение строк с кириллицей — никаких проблем.

Я пишу и компилирую в IDE MS Visual Studio 2010 Ultimate. Может быть на моем этапе еще рано задумываться о таких вещах, как кодировка символов в файлах и консоли, но проблема есть и некоторые задумки ставит в тупик, although English always has been my favorite lenguadge :).
Череп, подскажи пожалуйста, что нужно сделать в моей IDE, чтобы не было

никаких проблем.

Собственно вот: Практическое руководство. Управление файлами с помощью кодировки.

Пишешь консольное приложение со строками на русском языке и сохраняешь файл (в IDE) с кодировкой «Кириллица (DOS) — кодовая страница 866». При этом не нужны никакие дополнительные телодвижения ни при выводе кириллицы, ни при вводе, ни при сравнении строк. Все библиотечные функции работают так же, как с чистой латиницей.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.