%C2%A0是什么

今天突然有运营找我,说一个功能出问题了,于是上服务器调试查看,发现是一个sql查询不出数据导致的。
以为项目很古老,用的很古老的ci框架,调试也不方便,sql报错也不提示,只是返回一个false

调试sql

于是添加断点,打印sql,去数据库查询,一顿常规操作之后,发现能正常查询数据。
emm~这就奇怪了,看起来sql并没有问题

查看数据库连接

然后以为是数据库连接问题,把链接对象打印出来,查看账号密码IP端口,拿到命令行尝试,能正常链接
WTF~这是见鬼了吗

再次调试sql

由于sql是用批量id作in查询,因此把id固定写死几个,再去调试,发现能查出结果了
再次仔细查看第一步的sql,发现id中间确实有个空格
窃喜~以为终于找到问题,但是回想刚才拿这个打印出的sql去数据库执行,确实也能查询出数据

解决ing…

先不管三七二十八,想办法把空格去掉再说。
于是~str_replace(' ', '', $str); 。。。空格还在
然后~ preg_replace('/\s/', '', $str); 。。。空格仍在
继续~ trim($str);。。。空格仍然健在
哇擦嘞~还能不能行了
最后想到个曲线救国的方法,因为id是数字,使用intval($str),总算把空格去掉了

今天的主角

虽然问题解决了,但是有点莫名其妙,一个空格这么顽强,于是想办法看看这个空格是什么
使用echo urlencode($str);终于看到它的原形~%C2%A0
遂百度之,得出一个名词不换行空格也就是&nbsp,这货在html很常见,但是隐藏在PHP中确实让人折腾

看看权威解释

不换行空格

它在UTF-8中编码为0xC2 0xA0,即上面打印出的%C2%A0

解决

知道了它是什么,想要解决就简单了,因为是utf8字符,直接用正则表达式替换即可
preg_replace("/\s/u", '', $str);

END

%C2%A0是什么》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注