Regex, а так же конвертация ASCII to UTF8 C++

125
30 июня 2019, 04:00

В общем, картина следующая: у меня есть окно создания имени для персонажа и мне нужно решить 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
}

Но мне кажется, эта конструкция не совсем верная, так как цифры и там и там присутствуют, подскажите, люди добрые.

Answer 1

Первое, Ваш код конвертации бессмысленен:

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]*))$
READ ALSO
Помогите с потоками C++

Помогите с потоками C++

Работаю с потоками первый разПодскажите как решить проблему

118
Проверка на нажатия QPushButton

Проверка на нажатия QPushButton

Есть вектор: static QVector<QString>pages={"1","2","3","4","5"}; Нужно чтобы при каждой нажатии QPushButton в textBrowser выводилось по одному элементу вектора

101
Программа поиска и замены на Python или С++

Программа поиска и замены на Python или С++

Нужно написать программу, работающую по типу Поиска и Замены в ВордеНо при этом замена должна происходить на случайно-сгенерированное слово...

119
Условные переменные - где ошибка?

Условные переменные - где ошибка?

Опять у меня вопрос из-за чужого вопроса - на этот раз вот этого

129