бинарное сравнение строк PHP

Sergey
Sergey
810
3
Содержание:
  1. Комментарии
Задействуйте, Александр.
Помогите разобраться с вопросом бинарного сравнения строк в PHP.
Бинарное сравнение без учета регистра выводит на экран «2» в нижеописанном примере.
$str1 = "GeeksforGeeks"; 
$str2 = "eeeksforgeeks"; 
print_r(strncasecmp($str1, $str2, 13)); 
ПРАВИЛЬНО, по-моему (насколько мне удалось осмыслить эти вещи).

когда использую эту же функцию, но с учетом регистра
$str1 = "GeeksforGeeks"; 
$str2 = "zeeksforgeeks"; 
print_r(strncmp($str1, $str2, 13)); 
то выводит -1.
отображается информация как при обычном сравнении (1, 0 или -1).

Нашел значение "-32" в пособии для выражения:
$str1 = "GeeksforGeeks"; 
$str2 = "geeksforgeeks"; 
print_r(strncmp($str1, $str2, 13)); 
но на экран у меня, по-прежнему, выводит -1!
Почему, одна и та же функция корректно работает без учета регистра, и не хочет работать с учетом регистра?!

СПАСИБО!

Комментарии:

  1. Sergey
    Sergey
    07.04.2020, 07:58
    Спасибо, Александр. Ваш ответ пролил свет на некие вещи, в т.ч. и на сам алгоритм сравнения строк (немного по-другому представлялась картина)!
    В настройках самого сервера еще поищу причину в кодировке.
    Хорошего дня!
    1. Sergey
      Sergey
      06.04.2020, 12:28
      подключен сервер APACHE!

      генерирую в этой песочнице www.w3schools.com/php/phptryit.asp?filename=tryphp_func_string_strncmp2
      КОРРЕКТНО ОТОБРАЖАЕТ, -32.

      Вероятно, тормозит APACHE! Поскольку, корректность отображения выборочная! Сервер работает.

      В чем возможные причины?

      СПАСИБО!
      1. Александр Мальцев
        Александр Мальцев
        06.04.2020, 15:28
        Здравствуйте!
        Это скорее всего из-за используемой у вас кодировки. Т.е. в книге используется одна кодировка, а у вас другая.

        Т.е. чтобы разобраться как эти функции сравнивают, нужно понять, что каждый символ в кодировке имеет какой-то определённый числовой код.

        Работу функции strncmp можно представить следующим образом:
        1. Перевод первого символа 1 строки в числовой код:
        Например, в кодировке UTF-8 в строке GeeksforGeeks первый символ – это G, он имеет числовой код, равный 71.
        2. Перевод первого символа 2 строки в числовой код:
        Например, в кодировке UTF-8 в строке geeksforgeeks первый символ – это g, он имеет значение 103.
        3. Вычисляется разница этих значений. В данном случае она не равна 0. Следовательно, строки не равны. Эта разность (71 — 103 = -32), а именно -32 возвращается в качестве результата.

        Если бы их числовые коды были бы равны, то функция strncmp перешла бы к сравнению вторых символов этих строк и т.д.

        Если бы все коды символов строк на указанной длине были бы равны, то функция strncmp возвратила бы 0. В противном случае она возвращает разницу между символами.

        Функция strncasecmp выполняет те же действия только без учёта регистра символов.
      Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.