需求:
我要读取一个csv档,然后判断某个id的内容有无更新
该csv档用逗号区隔,中文没有双引号包起来
尝试:
既然是csv,直接上fgetcsv,
但因为中文没有双引号包起来,导致资料分隔错误,
连续好几个栏位被当成一个栏位....
所以乾脆fgets自己来...
状况:
其中一个栏位出了问题....
在判断有无更新时,读取csv的字串跟原本的字串比较
在字串比对时肉眼上看
if ("-2.16.886.101.90028.20002-20017-" == "-2.16.886.101.90028.20002-20017-")
理论上是相同的,但就是进不去if
我肉眼看,单步执行查看变数看到的内容皆是一样,却怎么都是false !!??
嗯?
输出长度长度应为32,但读取出来却是35 !!??
嗯? 有不可见的特殊未知字元藏在其中!!
那来排除特殊字元吧...
处理方式
下面是各种尝试
$t = $v['oid'];echo $t . ' len:'. strlen($t) . "\xA";// -2.16.886.101.90028.20002-20017- len:35$t = trim($v['oid']);echo $t . ' len:'. strlen($t) . "\xA";// -2.16.886.101.90028.20002-20017- len:35$t = trim($v['oid'], " \t\n\r\0\x0B \z\000\x00\u0000\a\b\v\f\e");echo $t . ' len:'. strlen($t) . "\xA";// -2.16.886.101.90028.20002-20017- len:35$t = preg_replace("/\W/", '', $v['oid']);echo $t . ' len:'. strlen($t) . "\xA";// 216886101900282000220017 len:24// 总算把那个怪符号弄掉了,但也误杀要留的'-',regex怎么改...不熟,有前辈知道的话麻烦告知一下$t = bin2hex($target);echo $t . ' len:'. strlen($t) . "\xA";// 2d322e31362e3838362e3130312e39303032382e32303030322d32303031372d len:64$t = hex2bin(bin2hex($target));echo $t . ' len:'. strlen($t) . "\xA";// -2.16.886.101.90028.20002-20017- len:32// 转码出去再转回来字串长度就正确了,内容看起来也没问题
输出结果
输出到cmd上可以看到前面多个空白,但若透过IDE单步执行查看变数内容、或输出到文字档的话,啥都没看到...
-2.16.886.101.90028.20002-20017- len:35-2.16.886.101.90028.20002-20017- len:35-2.16.886.101.90028.20002-20017- len:35216886101900282000220017 len:242d322e31362e3838362e3130312e39303032382e32303030322d32303031372d len:64-2.16.886.101.90028.20002-20017- len:32
结论
透过转码,转码出去再转回来字串长度就正确了,内容看起来也没问题
-> 没效....只是在cmd上看起来有解决而已XD
透过 浅水员 的支援得知是UTF-8 BOM
知道原因后就简单了 PHP 判断/移除 BOM(UTF-8) 解决~
**疑问 **
这个特殊字元到底是啥??
-> 感谢 浅水员 的支援,是 UTF-8 BOM