Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для BABLIK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.03.2017
    Сообщений
    5
    Репутация:
    0 ±

    Почему strcmp не работает с кириллицей?

    Всем привет!
    Как сравнить 2 русских слова без учёта регистра ?

    Вот так работает, но только на английских буквах:

    PHP код:
    if(!strcmp("pawn","Pawn",true))
    {



  2. #2
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Под Windows должно работать. А под Linux не работает потому, что используется стандартная tolower функция, которая работает только для латиницы.

  3. #3
    Аватар для BABLIK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.03.2017
    Сообщений
    5
    Репутация:
    0 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Под Windows должно работать. А под Linux не работает потому, что используется стандартная tolower функция, которая работает только для латиницы.
    Есть ли другой способ сверить слова ? Чтобы всё работало

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Можешь попробовать взять функцию memcmp из этой библиотеки
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от BABLIK Посмотреть сообщение
    Есть ли другой способ сверить слова ? Чтобы всё работало
    Можно написать свою, исправленные tolower и toupper можешь найти в fixes.inc. Может быть в будущем я это там исправлю сам.

  6. Пользователь сказал cпасибо:
    BABLIK (20.03.2017)
  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Тщательно не тестировал, но вот, как вариант:
      Открыть/закрыть
    PHP код:
    stock ds_strcmp(const string1[], const string2[], bool:ignorecase=falselength=cellmax)
    {
        static
            
    str1_len,
            
    str2_len,
            
    pos,
            
    str1_sumbol,
            
    str2_sumbol,
            
    result;
        if(
    ignorecase == true)
        {
            
    str1_len strlen(string1);
            
    str2_len strlen(string2);
            
    result 0;

            if(
    length == cellmax)
            {
                if(
    str1_len != str2_len)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
                else
                    
    length str1_len;
            }
            else
            {
                if(
    str1_len length || str2_len length)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
            }

            for(
    pos lengthpos != -1; --pos)
            {
                if(
    string1{0} == 0)
                    
    str1_sumbol string1[pos];
                else
                    
    str1_sumbol string1{pos};

                if(
    string2{0} == 0)
                    
    str2_sumbol string2[pos];
                else
                    
    str2_sumbol string2{pos};

                switch(
    str1_sumbol)
                {
                    case 
    'А'..'Я''A'..'Z':
                        
    str1_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str1_sumbol += ('ё' 'Ё');
                }
                switch(
    str2_sumbol)
                {
                    case 
    'А'..'Я''A'..'Z':
                        
    str2_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str2_sumbol += ('ё' 'Ё');
                }
                if(
    str1_sumbol != str2_sumbol)
                {
                    if(
    str1_sumbol str2_sumbol)
                        
    result 1;
                    else
                        
    result = -1;
                    break;
                }
            }
        }
        else
            
    result strcmp(string1string2ignorecaselength);

        return 
    result;


     Версия до изменения (не рабочая)
    PHP код:
    stock ds_strcmp(const string1[], const string2[], bool:ignorecase=falselength=cellmax)
    {
        if(
    ignorecase == true)
        {
            static
                
    str1_len,
                
    str2_len,
                
    pos,
                
    str1_sumbol,
                
    str2_sumbol,
                
    result;

            
    str1_len strlen(string1);
            
    str2_len strlen(string2);
            
    result 0;

            if(
    length == cellmax)
            {
                if(
    str1_len != str2_len)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
                else
                    
    length str1_len;
            }
            else
            {
                if(
    str1_len length || str2_len length)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
            }

            for(
    pos lengthpos != -1; --pos)
            {
                
    str1_sumbol string1[pos];
                
    str2_sumbol string2[pos];
                switch(
    str1_sumbol)
                {
                    case 
    'А'..'Я':
                        
    str1_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str1_sumbol += ('ё' 'Ё');
                }
                switch(
    str2_sumbol)
                {
                    case 
    'А'..'Я':
                        
    str2_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str2_sumbol += ('ё' 'Ё');
                }
                if(
    str1_sumbol != str2_sumbol)
                {
                    if(
    str1_sumbol str2_sumbol)
                        
    result 1;
                    else
                        
    result = -1;
                    break;
                }
            }
        }
        else
            
    result strcmp(string1[], string2[], ignorecaselength);

        return 
    result;


    Проблем с передачей массивов нет, ибо изменение регистра происходит в отдельных переменных.
    Если всё будет работать как надо, можно попробовать извратиться над оптимизацией
    Последний раз редактировалось DeimoS; 20.03.2017 в 12:10.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    BABLIK (20.03.2017)
  9. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Тщательно не тестировал, но вот, как вариант:
      Открыть/закрыть
    PHP код:
    stock ds_strcmp(const string1[], const string2[], bool:ignorecase=falselength=cellmax)
    {
        if(
    ignorecase == true)
        {
            static
                
    str1_len,
                
    str2_len,
                
    pos,
                
    str1_sumbol,
                
    str2_sumbol,
                
    result;

            
    str1_len strlen(string1);
            
    str2_len strlen(string2);
            
    result 0;

            if(
    length == cellmax)
            {
                if(
    str1_len != str2_len)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
                else
                    
    length str1_len;
            }
            else
            {
                if(
    str1_len length || str2_len length)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
            }

            for(
    pos lengthpos != -1; --pos)
            {
                
    str1_sumbol string1[pos];
                
    str2_sumbol string2[pos];
                switch(
    str1_sumbol)
                {
                    case 
    'А'..'Я':
                        
    str1_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str1_sumbol += ('ё' 'Ё');
                }
                switch(
    str2_sumbol)
                {
                    case 
    'А'..'Я':
                        
    str2_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str2_sumbol += ('ё' 'Ё');
                }
                if(
    str1_sumbol != str2_sumbol)
                {
                    if(
    str1_sumbol str2_sumbol)
                        
    result 1;
                    else
                        
    result = -1;
                    break;
                }
            }
        }
        else
            
    result strcmp(string1[], string2[], ignorecaselength);

        return 
    result;


    Проблем с передачей массивов нет, ибо изменение регистра происходит в отдельных переменных.
    Если всё будет работать как надо, можно попробовать извратиться над оптимизацией
    Нужно вынести из if-блока, ибо будут ошибки:
    Код:
    static
    			str1_len,
    			str2_len,
    			pos,
    			str1_sumbol,
    			str2_sumbol,
    			result;
    Нужно убрать скобки.
    Код:
    result = strcmp(string1[], string2[], ignorecase, length);
    С русскими буквами работает. Кстати, ты не добавил поддержку букв латинского алфавита и упакованных строк.

  10. 2 пользователя(ей) сказали cпасибо:
    BABLIK (20.03.2017) DeimoS (20.03.2017)
  11. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Поддержка латинского алфавита изначально была, а вот потом я почему-то решил, что там она не нужна
    За остальные замечания тоже спасибо. Нативный strcmp и переменные правил уже на форуме и как-то не углядел, что будут ошибки :(

    Как вариант, так:
      Открыть/закрыть
    PHP код:
    stock ds_strcmp(const string1[], const string2[], bool:ignorecase=falselength=cellmax)
    {
        static
            
    str1_len,
            
    str2_len,
            
    pos,
            
    str1_sumbol,
            
    str2_sumbol,
            
    result;
        if(
    ignorecase == true)
        {
            
    str1_len strlen(string1);
            
    str2_len strlen(string2);
            
    result 0;

            if(
    length == cellmax)
            {
                if(
    str1_len != str2_len)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
                else
                    
    length str1_len;
            }
            else
            {
                if(
    str1_len length || str2_len length)
                {
                    if(
    str1_len str2_len)
                        return 
    1;
                    else
                        return -
    1;
                }
            }

            for(
    pos lengthpos != -1; --pos)
            {
                if(
    string1{0} == 0)
                    
    str1_sumbol string1[pos];
                else
                    
    str1_sumbol string1{pos};

                if(
    string2{0} == 0)
                    
    str2_sumbol string2[pos];
                else
                    
    str2_sumbol string2{pos};

                switch(
    str1_sumbol)
                {
                    case 
    'А'..'Я''A'..'Z':
                        
    str1_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str1_sumbol += ('ё' 'Ё');
                }
                switch(
    str2_sumbol)
                {
                    case 
    'А'..'Я''A'..'Z':
                        
    str2_sumbol += ('а' 'А');
                    case 
    'Ё':
                        
    str2_sumbol += ('ё' 'Ё');
                }
                if(
    str1_sumbol != str2_sumbol)
                {
                    if(
    str1_sumbol str2_sumbol)
                        
    result 1;
                    else
                        
    result = -1;
                    break;
                }
            }
        }
        else
            
    result strcmp(string1string2ignorecaselength);

        return 
    result;



    Но я бы, в идеале, избавился от постоянных проверок, запакована ли строка, но для этого придётся для каждого случая свой цикл создать (ну или может я какой-то другой вариант упускаю)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. Пользователь сказал cпасибо:
    BABLIK (20.03.2017)
 

 

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •