В общем, картина следующая: у меня есть окно создания имени для персонажа и мне нужно решить 2 проблемы с которыми я столкнулся.
Проблема 1: Я получаю имя персонажа в char, но чтобы поддерживать кириллицу (если имя персонажа присланно в Кириллице), то мне нужно использовать вот такой код, в противном случае отображаются кракозябры:
char szCharacterName[40];
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring ChrnameUTF8 = converter.from_bytes(szCharname);
std::string Chrname = converter.to_bytes(ChrnameUTF8);
Как видите, такая конструкция создает дополнительный лишний код, можно ли как то напрямую конвертировать char Кириллицу в std::string чтоб выводило Русские символы, но при этом не терять возможность поддержки и латинских (если вдруг имя персонажа состоит из Латиницы + Кириллицы, или просто Кириллица или Латиница)
Проблема 2: Как я могу с помощью regex поставить ограничение на имя персонажа, ограничение по типу: только латиница + цифры + подчеркивание, только кириллица + цифры + подчеркивание. (Важно: Цифры и подчеркивания не являются обязательными, просто разрешено использовать) Иначе говоря, что-то одно, чтобы имя персонажа не состояло из Латиницы+Кириллицы, например: "НикName" - не подходит.
Я попытался сделать так:
std::regex rgx_rus("^[А-Яа-я][А-Яа-яёЁ\d]*$");
std::regex rgx_eng("^[A-Za-z][A-Za-z\d]*$");
if ((regex_match(Chrname.begin(), Chrname.end(), rgx_eng) == true) && (regex_match(Chrname.begin(), Chrname.end(), rgx_rus) == true))
{
// Error
}
Но мне кажется, эта конструкция не совсем верная, так как цифры и там и там присутствуют, подскажите, люди добрые.
Первое, Ваш код конвертации бессмысленен:
char szCharacterName[40];
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring ChrnameUTF8 = converter.from_bytes(szCharname);
std::string Chrname = converter.to_bytes(ChrnameUTF8);
Очевидно, что в szCharacterName
текст уже в UTF-8, который Вы перегоняете в UCS-2(4), а потом обратно в UTF-8. Абсолютно бессмысленная процедура — просто используйте szCharacterName
Второе, поддержка регулярных выражений для UTF-8 строк зависит от компилятора, но если поддержка есть, то такое вот выражение должно Вам подойти:
^(([А-Яа-я][А-Яа-яёЁ\d]*)|([A-Za-z][A-Za-z\d]*))$
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть вектор: static QVector<QString>pages={"1","2","3","4","5"}; Нужно чтобы при каждой нажатии QPushButton в textBrowser выводилось по одному элементу вектора
Нужно написать программу, работающую по типу Поиска и Замены в ВордеНо при этом замена должна происходить на случайно-сгенерированное слово...
Опять у меня вопрос из-за чужого вопроса - на этот раз вот этого