Проверка на русские буквы

Сообщения
673
Реакции
242
Помог
11 раз(а)
Добрый вечер

как проверить написал ли игрок русскими буквами если так то вернуть true;

Дело в том что MySql запрос не может распознавать русские буквы, делаю так. из форума сказали что над каждый запросом присвоитьSET NAMES 'utf8';
Код:
        new query[QUERY_LENGTH], que_len;

        que_len += formatex(query[que_len],charsmax(query) - que_len,  "SET NAMES 'utf8';SELECT `Login`, `Password` FROM %s WHERE `Login` = '%s' AND `Password` = '%s'",g_szRankTable, login, pass);
            

        new sData[EXT_DATA_STRUCT];
        sData[EXT_DATA__SQL] = SQL_LOADPLAYERDB;
        sData[EXT_DATA__INDEX] = id;
        sData[EXT_DATA__USERID] = get_user_userid(id);

        copy(sData[EXT_DATA__LOGIN], 31, login);
        copy(sData[EXT_DATA__PASS], 31, pass);

        SQL_ThreadQuery(g_hDBHandle, "selectQueryHandler", query, sData, sizeof sData);
но без результата

чем с танцами бубмани то просто заблокирую русские буквы


Создание таблицы....
Код:
    SQL_SetCharset(g_hDBHandle,"utf8");

    new query[QUERY_LENGTH], que_len;

    que_len += formatex(query[que_len],charsmax(query) - que_len, "CREATE TABLE IF NOT EXISTS `%s` (\
    `id` int(11) NOT NULL AUTO_INCREMENT,\
    `Login` VARCHAR(12) NOT NULL default '',\
    `Password` VARCHAR(12) NOT NULL default '',\
    `Email` VARCHAR(32) NOT NULL default '',\
    `Auth` VARCHAR(32) NOT NULL default '',\
    PRIMARY KEY (`id`))", g_szRankTable);
    

    new sData[EXT_DATA_STRUCT];
    sData[EXT_DATA__SQL] = SQL_INITDB;

    SQL_ThreadQuery(g_hDBHandle, "selectQueryHandler", query, sData, sizeof sData);
русский логин и все остальные сохраняются, но запрос не может взять с базы обратно
2 Окт 2019
Если убрать SET NAMES 'utf8' то выбьет ошибку [ 1366 ] Incorrect string value: '\x94\xD0\xBE\xD1\x81\xD0...' for column 'Login' at row 1
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
fantom, спасибо за ответ, как видно из кода то я выставил значение , только что пошаманил вроде работает с русскими никами, но с багами, можно ли как то заблокировать ввода русские буквы?
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Есть вот такое. Но я более чем уверен, что можно и лучше. Я просто никогда не курил кодировки, и когда писалось, лениво было разбираться (утонул уже в этих тестах).
Код:
bool:IsAllCharsValid(szBuffer[], bool:bMailMode = false) {
    static const iCharsTable[] = {
        '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'q', 'Q', 'w', 'W', 'e', 'E', 'r', 'R', 't', 'T',
        'y', 'Y', 'u', 'U', 'i', 'I', 'o', 'O', 'p', 'P', 'a', 'A', 's', 'S', 'd', 'D', 'f', 'F', 'g', 'G',
        'h', 'H', 'j', 'J', 'k', 'K', 'l', 'L', 'z', 'Z', 'x', 'X', 'c', 'C', 'v', 'V', 'b', 'B', 'n', 'N',
        'm', 'M'
    }

    new iPos, i

    while(szBuffer[iPos] != EOS) {
        if(is_char_mb(szBuffer[iPos])) {
            return false
        }

        if(bMailMode && (szBuffer[iPos] == '@' || szBuffer[iPos] == '.')) {
            iPos++
            continue
        }

        for(i = 0; i < sizeof(iCharsTable); i++) {
            if(szBuffer[iPos] == iCharsTable[i]) {
                break
            }
        }

        if(i == sizeof(iCharsTable)) {
            return false
        }

        iPos++
    }

    return true
}

У мистрика видел вот такое, касаемо диапазонов.
Код:
generate_string(str[], len)
{
    for(new i; i < len; i++) {
        switch(random(2)) {
            case 0: str[i] = random_num('A', 'Z');
            case 1: str[i] = random_num('a', 'z');
        }
    }
    str[len] = 0;
}
А в БГ у меня есть рабочее
Код:
while(szPart[0] >= '0' && szPart[0] <= '9')
Так что перебор циклом по iCharsTable можно заменить на условия 'в диапазоне'
 

Вложения

  • 833 байт Просмотры: 9
Сообщения
673
Реакции
242
Помог
11 раз(а)
BlackSignature, первый вариант зашло, спасибо
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Limbooc, зачем блокировать, когда нужно разобратся с кодировкой. А это значит что кроме того, что само соединение установить в utf8 (без косиыля с set names) так и установить кодировку строковым полям. как минимуи плсмотрите статистику сера фримена. Почему у него все хранит нормально?
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Что ещё за "Русские буквы" ? В украинском языке тоже русские буквы ? :smile3: Есть такое понятие - алфавит. Помимо кириллического, о котором вы говорите, есть ещё латинский, всякие китайские, японские, арабские и прочие алфавиты. Их вы тоже собираетесь фильтровать ?

спасибо за ответ, как видно из кода то я выставил значение
Зачем вы отправляете SQL_SetCharset при создании таблицы ? Таблицу создают один раз и как правило вручную. SQL_SetCharset нужно слать при отправке данных в таблицу.
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
BlackSignature, можно с помощью регулярных выражений. я себе делал, но один из скриптеров сказал, что регулярные выражения мало кто использует, поэтому у меня есть сомнения

p.s есть функция isalnum()
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
PHP:
strlen_utf(msg[])
{
    new i, ansi, utf;
   
    while (msg) {
        if (msg < 0 || msg > 127) {
            utf++;
        }
        else {
            ansi++;
        }
        i++;
    }
    
    return utf;
}
 
Сообщения
141
Реакции
201
Помог
5 раз(а)
123
 
Последнее редактирование:
Сообщения
198
Реакции
16
Помог
1 раз(а)
в общем, либо тернарки, либо запретить все символы, кроме необходимых


Код:
 for(new i; i < strlen(inputtext); i++)
{
     switch(inputtext[i])
     {
         case 'A'..'Z', 'a'..'z', '0'..'9': {} // пропускаем (сюда нельзя вставлять кириллицу, выбьет ошибку, поэтому если нужно разрешить кириллицу - этот метод не подходит)
         default:
        {
            /* здесь return с уведомлением об ошибке */
        }
    }
}
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
gyxoBka, лучше я б этого не видел. Кроме проверки на диапазон тут все не так включая наименования переменных. Для справки
  • ANSI - институт стандартызации (тык)
  • Стандарт отвечающий за кодировкы называется ASCII
  • Сам ASCII гласит что все символы от 0 до 127 кода везде идентичны. Все символы после уже зависят именно от самой кодировки.
  • UFF-8 имеет обратную совместимость с ASCII, что означает то, что первые 128 символов идентичны как и в cp1251 например.
  • Для идентификации символа в UTF-8 надо чекать первые байты в октетах (также описано на вики)
  • Для удобной идентификации утф-8 в AMXX 1.8.3 ввели натив https://dev-cs.ru/amxx/string/is_char_mb/view


И наконец я устал повторять: зачем запрещать кирилицу если нужно указать одну и ту же кодировку в таблице, поле и соединении.
3 Окт 2019
kucklovod, еще одни костыли. Читайте пост више: все символы код которых входит в диапазон от 0 до 127 одинаковы во всех кодировках стандарта ASCII (включая UTF-8 который имеет совместимость).
3 Окт 2019
Limbooc, Читайте код внимательно
https://github.com/serfreeman1337/csstatsx-sql/blob/master/scripting/csstatsx_sql.sma#L850-L856
https://github.com/serfreeman1337/csstatsx-sql/blob/master/scripting/csstatsx_sql.sma#L958

А также существует много других материалов в интернете по кодировкам в mysql. Одна беда в том, что амхх 1.8.2 не умел грамотно указывать кодировку соединения. И потому использовали костыль с SET NAMES.

P.S. Чтобы грамотно везде все отображалось, то повторюсь кодировка везде должна быть указана одинакова. ВЕЗДЕ. В mysql, в плагине амхх, в php, в заголовках HTTP, также в meta теге html. Только тогда все будет работать нормально.

P.S.S. Использовать следует именно UTF-8 так как он в себе совмещает многие символы в отличии от однобайтовых кодировок, что позволяет избежать неправильного отображения других языков или символов (в тех же никнеймах в goldsrc можна указать емодзи)

P.S.S.S. Так случилось исторически что в mysql кодировка utf-8 не имеет полную поддержку всех символов utf-8. Для этого следует использовать utf8mb4. Дополнительно обратите внимание на collation который также стоит указать. От него зависит как mysql будет сравнивать строкы. И об этом также полно информации в интернете
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
во всех соц сетях запрещено, неужели не могут решить проблемы с кодировкой?
Большего бреда я не слышал. Разберитесь вначале в вопросе прежде чем такое говорить. И честно я и так уже много расписал подробностей чтобы еще и тут расписивать целую страницу что где и почему так в тех же соцсетях. И это выйдет большой такой оффтоп.
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
fantom, ну а кто говорил, что легко будет : ] я за 30 сек накидал концепцию, кому надо тот поймет.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
fantom, спасибо за ответ, все фиксанул, каким-то образом при создание таблицы дефолтом выставлялся кодировка 'latin1_swedish_ci'

сделал следующие
Код:
COLLATE='utf8_general_ci',\
        ENGINE=InnoDB,\
        AUTO_INCREMENT=3;"
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу