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,然后就有此时测试实验。应该是编码问题。
然后仅作为记录使用。