У меня две строки, которые выглядят одинаково, когда я их повторяю, но когда я их 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
Это расшифровывается как:
Или, как указано в комментариях @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.