Вопрос ExecuteClientCmd(say), не работают русские символы

Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2019
Сообщения
163
Реакции[?]
10
Поинты[?]
1K
C++:
    static std::string chatspam[] =
    {
        crypt_str("тест"),
        crypt_str("тест два")
    };
    std::string msg = crypt_str("say " ) + chatspam[rand() % 2];
    m_engine()->ExecuteClientCmd(msg.c_str());
В общем, в чём суть то, когда код доходит до выполнения этого *задания*, то русские символы в чате отображаются совсем неправильно, примерно как на этом скрине:1621612823571.png

Какой-нибудь setlocale(LC_ALL, "Russian"); не помогает

Как исправить?
 
..................................................
Участник
Статус
Оффлайн
Регистрация
13 Авг 2020
Сообщения
981
Реакции[?]
245
Поинты[?]
21K
Код:
crypt_str(u8"тест"),
crypt_str(u8"тест два")
Если только шрифт поддерживает русский язык
 
Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2019
Сообщения
163
Реакции[?]
10
Поинты[?]
1K
Есть ещё варианты?
 
Эксперт
Статус
Оффлайн
Регистрация
17 Фев 2017
Сообщения
865
Реакции[?]
420
Поинты[?]
1K
Все файлы в которых ты пишешь код и строки текста на русском кодируй в UTF-8 Without BOM.

А вообще, crypt_str возможно не поддерживает кириллицу.
 
  • Клоун
Реакции: sove
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
808
Реакции[?]
414
Поинты[?]
46K
setlocale(LC_ALL, "Russian");
Она выставляет локаль для ряда стандартных функций и консоли, к игре не имеет никакого отношения.
Чтобы отправить русский текст нужно его передать в виде UTF-8, для этого действительно используется префикс u8"строка" как написали выше.
То что выдает какую-то ошибку с std::string абсолютно странно откуда она там могла взяться, если смотреть по этой реализации
Пожалуйста, авторизуйтесь для просмотра ссылки.
там она не используется, выходит у тебя какая-то самопальная кривая реализация.
char8_t должно свободно кастоваться в char до C++20, в любом случае на реализацию шифрования это никак не влияет, можно явно конвертировать в (const char*) ничего не сломается, т.к. что char что char8_t занимают по байту, хотя и UTF-8 может описывать один символ нескольими байтами.
 
Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2019
Сообщения
163
Реакции[?]
10
Поинты[?]
1K
Debounce, crypt_str.h:


C++:
#pragma once
#pragma optimize ("", off)

#include "..\version.h"
#include <array>

constexpr auto _time = __TIME__;
constexpr auto _seed = static_cast <int> (_time[7]) + static_cast <int> (_time[6]) * 10 + static_cast <int> (_time[4]) * 60 + static_cast <int> (_time[3]) * 600 + static_cast <int> (_time[1]) * 3600 + static_cast <int> (_time[0]) * 36000;

template <int N>
class RandomGenerator
{
    static constexpr unsigned a = 16807;
    static constexpr unsigned m = 2147483647; //-V112

    static constexpr unsigned s = RandomGenerator <N - 1>::value;
    static constexpr unsigned lo = a * (s & 0xFFFF);
    static constexpr unsigned hi = a * (s >> 16);
    static constexpr unsigned lo2 = lo + ((hi & 0x7FFF) << 16);
    static constexpr unsigned hi2 = hi >> 15;
    static constexpr unsigned lo3 = lo2 + hi;
public:
    static constexpr unsigned max = m;
    static constexpr unsigned value = lo3 > m ? lo3 - m : lo3;
};

template <>
class RandomGenerator <0>
{
public:
    static constexpr unsigned value = _seed;
};

template <int N, int M>
class RandomInt
{
public:
    static constexpr auto value = RandomGenerator <N + 1>::value % M;
};

template < int N >
class RandomChar
{
public:
    static const char value = static_cast <char> (1 + RandomInt <N, 0x7F - 1>::value);
};

template <size_t N, int K>
class XorString
{
    const char _key;
    std::array <char, N + 1> _encrypted;

    constexpr char enc(char c) const
    {
        return c ^ _key;
    }

    char dec(char c) const
    {
        return c ^ _key;
    }
public:
    template <size_t... Is>
    constexpr __forceinline XorString(const char* str, std::index_sequence< Is... >) : _key(RandomChar< K >::value), _encrypted { enc(str[Is])... }
    {

    }

    __forceinline decltype(auto) decrypt()
    {
        for (size_t i = 0; i < N; ++i)
            _encrypted[i] = dec(_encrypted[i]); //-V120
     
        _encrypted[N] = '\0'; //-V120
        return _encrypted.data();
    }
};

#if RELEASE
#define crypt_str(s) XorString <sizeof(s) - 1, __COUNTER__> (s, std::make_index_sequence <sizeof(s) - 1>()).decrypt()
#else
#define crypt_str(s) s
#endif

#pragma optimize ("", on)
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
808
Реакции[?]
414
Поинты[?]
46K
Хорошо, проблема вот в чем:
В C++20 (а ты видимо используешь std::latest) char8_t перестает быть совместимым напрямую с char, поэтому когда ты инициализируешь строку std::string в массиве с константной строкой (пусть и через шифрование) у std::string нет конструктора из char8_t*.
Чтобы пофиксить замени std::string -> std::u8string и тогда оно будет работать с u8"строка" и русский текст заработает.
 
Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2019
Сообщения
163
Реакции[?]
10
Поинты[?]
1K
Хорошо, проблема вот в чем:
В C++20 (а ты видимо используешь std::latest) char8_t перестает быть совместимым напрямую с char, поэтому когда ты инициализируешь строку std::string в массиве с константной строкой (пусть и через шифрование) у std::string нет конструктора из char8_t*.
Чтобы пофиксить замени std::string -> std::u8string и тогда оно будет работать с u8"строка" и русский текст заработает.
1621760975661.png
 
Участник
Статус
Оффлайн
Регистрация
26 Мар 2019
Сообщения
707
Реакции[?]
167
Поинты[?]
1K
C++:
    static std::string chatspam[] =
    {
        crypt_str("тест"),
        crypt_str("тест два")
    };
    std::string msg = crypt_str("say " ) + chatspam[rand() % 2];
    m_engine()->ExecuteClientCmd(msg.c_str());
В общем, в чём суть то, когда код доходит до выполнения этого *задания*, то русские символы в чате отображаются совсем неправильно, примерно как на этом скрине:Посмотреть вложение 149902

Какой-нибудь setlocale(LC_ALL, "Russian"); не помогает

Как исправить?
Ауеть
C++:
void misc::ChatSpamer()
{
    if (!g_cfg.misc.chat)
        return;

    static std::string chatspam[] =
    {
        crypt_str(u8"минет"),
        crypt_str(u8"Да"),
        crypt_str(u8"ХАХАХАХА"),
        crypt_str(u8"ОЛО СКИТ БУСТИТ"),
    };

    static auto lastspammed = 0;

    if (GetTickCount() - lastspammed > 800)
    {
        lastspammed = GetTickCount();

        srand(m_globals()->m_tickcount);
        std::string msg = crypt_str("say ") + chatspam[rand() % 4];

        m_engine()->ExecuteClientCmd(msg.c_str());
    }
}
ss:1621803403678.png
 
Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2019
Сообщения
163
Реакции[?]
10
Поинты[?]
1K
Ауеть
C++:
void misc::ChatSpamer()
{
    if (!g_cfg.misc.chat)
        return;

    static std::string chatspam[] =
    {
        crypt_str(u8"минет"),
        crypt_str(u8"Да"),
        crypt_str(u8"ХАХАХАХА"),
        crypt_str(u8"ОЛО СКИТ БУСТИТ"),
    };

    static auto lastspammed = 0;

    if (GetTickCount() - lastspammed > 800)
    {
        lastspammed = GetTickCount();

        srand(m_globals()->m_tickcount);
        std::string msg = crypt_str("say ") + chatspam[rand() % 4];

        m_engine()->ExecuteClientCmd(msg.c_str());
    }
}
ss:Посмотреть вложение 150236
Человек же сверху написал в чём проблема, у тебя скорее всего 17-го года стандарт C++, поэтому всё прекрасно работает, а у меня был std:latest, он же 20-й, из-за чего и возникала проблема.
 
..................................................
Участник
Статус
Оффлайн
Регистрация
13 Авг 2020
Сообщения
981
Реакции[?]
245
Поинты[?]
21K
Ауеть
C++:
void misc::ChatSpamer()
{
    if (!g_cfg.misc.chat)
        return;

    static std::string chatspam[] =
    {
        crypt_str(u8"минет"),
        crypt_str(u8"Да"),
        crypt_str(u8"ХАХАХАХА"),
        crypt_str(u8"ОЛО СКИТ БУСТИТ"),
    };

    static auto lastspammed = 0;

    if (GetTickCount() - lastspammed > 800)
    {
        lastspammed = GetTickCount();

        srand(m_globals()->m_tickcount);
        std::string msg = crypt_str("say ") + chatspam[rand() % 4];

        m_engine()->ExecuteClientCmd(msg.c_str());
    }
}
ss:Посмотреть вложение 150236
Либо я додик, либо пасту сломал, но у меня нихуя не спамит давно уже
 
Участник
Статус
Оффлайн
Регистрация
26 Мар 2019
Сообщения
707
Реакции[?]
167
Поинты[?]
1K
Человек же сверху написал в чём проблема, у тебя скорее всего 17-го года стандарт C++, поэтому всё прекрасно работает, а у меня был std:latest, он же 20-й, из-за чего и возникала проблема.
Эххх, а я ради тебя lw скачал :confounded:
 
Сверху Снизу