有段使用php的json_decode处理远程获得JSON信息的程序,发现json_decode一直无法正常解码,无论加了什么参数,都不行。经过排查json信息符合不符合规则等因素后,最后经过比对才发现其正常解码和不正常解码的json差异,
正常文本比对,在正常模式很难发现该差异;
16进制下比对,一目了然
该差异在于16进制选多出“ef bb bf”。经过查询,“ef bb bf”为UTF-8 BOM,又叫UTF-8 签名。其实UTF-8 的BOM对UFT-8没有作用,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉弱编辑器(记事本)当前文件采用何种编码,方便编辑器识别。
PHP在设计之初,没有考虑到BOM头的问题,因此很容易因为BOM头引发诡异的问题,比如编码转换失败,样式错乱等等问题,而且此问题相当隐蔽,很难确定发生问题的文件(试想在没有工具的情况下从上万的工程文件中找到哪个文件带有BOM头)。BOM头是隐藏字符,非编辑字符,就像普通空文件一样。
找到原因后,要解决就比较简单了,参见下面。
if(substr($getstr,0,3)=="\xEF\xBB\xBF")$getstr=substr_replace($getstr,'',0,3);
Comments | NOTHING