Не работает условие если писать текст на русском языке с++

Пишу тг бота на с++, предпологаю из функции для приёма сообщений от пользователя получается строка в кодирофке UTF-8, если писать условие к этой строке на английском то всё работает, но если использовать русский то ничего не рабоатет.

Вот необходимая часть кода. Данный вариант работает, если текст пользователя записан в строке mainStr

cout << mainStr << endl;

string keyword = "angl";
regex wordRegex("\\b" + keyword + "\\b", regex_constants::icase); 

if (regex_search(mainStr, wordRegex)) {
    cout << "naxod";
    bot.getApi().sendMessage(message->chat->id, u8"возможные варианты решения: ", false, 0, chstvopr_keyboard);
}
else {
    cout << "ne naxod";
}

Данный вариант не работает, вот setlocale(LC_ALL, "ru_RU.utf8"), если написать просто rus то пишется мусор из милиона знаков вопроса и прочей дряни.

string keyword = "русский";
regex wordRegex("\\b" + keyword + "\\b", regex_constants::icase); 

if (regex_search(mainStr, wordRegex)) {
    cout << "naxod";
    bot.getApi().sendMessage(message->chat->id, u8"возможные варианты решения: ", false, 0, chstvopr_keyboard);
}
else {
    cout << "ne naxod";
}

Ответы (1 шт):

Автор решения: Serge3leo

Как там, в C++, всё запущенно:

#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>

#include <locale>
#include <regex>
#include <string>

using namespace std;

int main() {
    #ifndef __STDC_ISO_10646__
        #warning "wchar_t locale depended"
        // Обычно, в этом случае, для UTF локалей, wchar_t - Unicode
    #endif
    // Частичная проверка того, что файл исходного кода, если в UTF,
    // то нормализованный по NFC  
    assert(!memcmp(L"АБЁЪЯабёъя", U"АБ\u0401ЪЯаб\u0451ъя",
                   10*sizeof(wchar_t)));

    setlocale(LC_ALL, "");
    locale::global(locale(setlocale(LC_ALL, 0)));

    wstring keyword = L"русский";
    wstring pattern = L"\\bрусски(й|и\u0306)\\b";
    // TODO: NFC нормализация входных данных, т.к. я не понимаю, как
    // подружить wregex с диакритическим знаками.
    
    wregex wordRegex(pattern, regex_constants::icase);

    wprintf(L"Ищем: %zu, \"%ls\"\n", keyword.size(), keyword.c_str());

    wchar_t wbuf[1024];
    while(fgetws(wbuf, sizeof(wbuf)/sizeof(wbuf[0]), stdin)) {
        wstring mainStr(wbuf);

        if(regex_search(mainStr, wordRegex)) {
            wprintf(L"Нашли %ls\n", pattern.c_str());
        } else {
            wprintf(L"Не нашли %ls\n", pattern.c_str());
        }
    }

    return 0;
}
→ Ссылка