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

У меня две строки, которые выглядят одинаково, когда я их повторяю, но когда я их var_dump() они имеют разные типы строк:

 Echo: http://blah http://blah var dump: string(14) "http://blah" string(11) "http://blah" strToHex: %68%74%74%70%3a%2f%2f%62%6c%61%68%00%00%00 %68%74%74%70%3a%2f%2f%62%6c%61%68 

Когда я их сравниваю, они возвращают false. Как я могу манипулировать строковым типом, чтобы выполнить сравнение, которое возвращает true. В чем разница между строкой 11 и строкой 14? Я уверен, что есть простое решение, но еще ничего не найдено, независимо от того, как я буду развязывать, взрывать, кодировать UTF8 и т. Д. Строки, которые они не будут сравнивать или изменять.

Спасибо за вашу помощь!

Питер.

    Обрезайте строки перед сравнением, есть escape-символы, такие как \ t и \ n, которые не видны.

    $clean_str = trim($str);

    Письмо «a» может быть записано в другом кодировании.
    Например: blаh – здесь a является кириллицей «а».
    Все эти буквы кирилличны, но выглядят как латинские: у, е, х, а, р, о, с

    При использовании var_dump() , string(14) означает, что это значение, которое содержит 14 байтов. Таким образом, string(11) и string(14) не являются разными «типами» строк, они являются просто строками разной длины.

    Я бы использовал что-то вроде этого, чтобы увидеть, что на самом деле находится внутри этих строк:

     function strToHex($value, $prefix = '') { $result = ''; $length = strlen($value); for ( $n = 0; $n < $length; $n++ ) { $result .= $prefix . sprintf('%02x', ord($value[$n])); } return $result; } echo strToHex("test\r\n", '%'); 

    Вывод:

     %74%65%73%74%0d%0a 

    Это расшифровывается как:

    • % 74 – т
    • % 65 – e
    • % 73 – с
    • % 74 – т
    • % 0d – \ r (возврат каретки)
    • % 0a – \ n (строка)

    Или, как указано в комментариях @Karolis, вы можете использовать встроенную функцию bin2hex() :

     echo bin2hex("test\r\n"); 

    Вывод:

     746573740d0a 

    Вы уже пытались обрезать эти строки?

     if (trim($string1) == trim($string2)) { // do things } 

    Попробуйте http://php.net/manual/en/function.strcmp.php для сравнения строк.

    Вероятно, строки Unicode в верхнем диапазоне считаются двойными байтами.

    Используйте mb_strlen для проверки длины.

    Также некоторые символы могут быть не видны, но присутствуют (есть много юникодных пространств и т. Д.),

    Как правило, когда вы работаете с функциями Unicode, вы должны использовать строковые функции mb_* .

    Вы можете перегружать функции строкового кодирования в php.ini чтобы всегда использовать функции mb_* вместо стандартных (не уверены, что mb_* эти настройки).

    В PHP 6 эта проблема будет решена, так как она должна быть в глобальном масштабе Unicode.