240
世界上有10种人,一种懂二进制,另一种不懂二进制。

PHP字符串比较,看起来值完全一样,但是就是不相等的解决方案(‌)

1 前言

字符串比较,看起来完全一样,然后用strcmp比较,永远不相等,用var_dump查看才知道,其中一个字符多了‌看不见的特殊符号,而我长度是3。

2 样例

当你选中它,显示出来的就是人眼所见即输出的网页的,有点儿意思~

3 分析

还未发现根本原因,暂无分析~,原因在于windows复制黏贴是会在字符串最前面加入3字节的"‌"导致长度+3了,当然无法匹配通过。

做了实验,用phpstrom IDE来测试,测试数据如下:

‌‌//第一组数据,异常
‌‌$str='47ec2dd791e31e2ef2076caf64ed9b3d'
‌47ec2dd791e31e2ef2076caf64ed9b3d

‌‌$str2
‌‌47ec2dd791e31e2ef2076caf64ed9b3d

‌‌strcmp($str,$str2);
‌-1

‌‌$str3 = $str;
‌47ec2dd791e31e2ef2076caf64ed9b3d

‌‌strcmp($str,$str3);
‌0

‌‌strcmp($str2,$str3);
‌1

‌‌strlen($str)
‌32
‌‌
‌‌strlen($str2)
‌35

‌‌strlen($str3)
‌32

把上面这个code,用html查看源码,如下。发现‌很多很多...

经过测试发现规律是,如果你复制黏贴$s后面的字符串,则长度一致,如果是复制的是输出的结果,则长度会+3,正如下图的红色和绿色的路线可知。  

4 解决方案

$len_sign = strlen($sign);
if($len_sign == 35){
	$sign = substr($sign,3,35);	
}

if(strcmp($sign,$sign_server) != 0 ){
	echo "invalid request errcode=4"; 
	die();
}  

5 小结

sign是32位复制或者一个字一个字敲进去的,结果到php后端会出现长度是35,然后就有此时测试实验。应该是编码问题。 

然后仅作为记录使用。

posted @ 2018-07-14 15:57  unionline  阅读(713)  评论(0编辑  收藏  举报