Не работает условие если писать текст на русском языке с++
Пишу тг бота на с++, предпологаю из функции для приёма сообщений от пользователя получается строка в кодирофке 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;
}