当我回显它时,我有两个看起来相同的字符串,但当我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编码等他们不会比较或更改类型的字符串。
感谢您的帮助!
彼得。
答案 0 :(得分:9)
字母“a”可以用其他编码书写
例如:blаh
- 此处a
是一个西里尔字母'''
所有这些字母都是西里尔字母,但看起来像拉丁语:у,е,х,а,р,о,с
答案 1 :(得分:7)
在比较之前修剪字符串,有不可见的Escaped字符,如\ t和\ n。
$clean_str = trim($str);
答案 2 :(得分:6)
使用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
答案 3 :(得分:3)
您是否已尝试trim这些字符串?
if (trim($string1) == trim($string2)) {
// do things
}
答案 4 :(得分:1)
请尝试http://php.net/manual/en/function.strcmp.php进行字符串比较。
答案 5 :(得分:1)
可能在较高范围内的Unicode字符串被计为双字节。
使用mb_strlen
检查长度。
也有些字符可能不可见,但存在(有许多unicode空格等)。
通常,在使用Unicode函数时,应使用mb_*
字符串函数。
您可以在php.ini
中重载字符串编码函数,以便始终使用mb_*
函数而不是标准函数(不确定xdebug
是否遵循这些设置)。
在PHP 6中,这个问题将得到解决,因为它应该是全局的Unicode识别。