Ответ 1
Обрезать строки перед сравнением, есть escape-символы, такие как \t и\n, которые не видны.
$clean_str = trim($str);
У меня две строки, которые выглядят одинаково, когда я их повторяю, но когда я 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)
означает, что значение string
, которое содержит 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
Это декодируется как:
Или, как указано в комментариях @Karolis, вы можете использовать встроенную функцию bin2hex()
:
echo bin2hex("test\r\n");
Вывод:
746573740d0a
Вы уже пробовали trim эти строки?
if (trim($string1) == trim($string2)) {
// do things
}
Попробуйте http://php.net/manual/en/function.strcmp.php для сравнения строк.
Вероятно, строки Unicode в верхнем диапазоне считаются двойными байтами.
Используйте mb_strlen
для проверки длины.
Также некоторые символы могут быть не видны, но присутствуют (есть много юникодовых пространств и т.д.)
Как правило, при работе с функциями Unicode вы должны использовать mb_*
строковые функции.
Вы можете перегружать функции кодирования строк в php.ini
, чтобы всегда использовать функции mb_*
вместо стандартных (не уверен, что xdebug
выполняет эти настройки).
В PHP 6 эта проблема будет решена, так как она должна быть в глобальном масштабе Unicode.