[笔记,php,csv]排除字串中未知特殊字元

需求:
我要读取一个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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章