×
广告

PHP解析json_decode返回null,处理BOM \ufefff

96
别瞄我
2017.03.29 23:23* 字数 360

问题现象

用json_decode()对JSON字符串进行编码转换成PHP变量时发现返回值为null,而且无明显的参数错误。

问题原因

百思不得其解,最后调试发现被转换的json字符串开头莫名其妙的带上了"\ufeff",查询后得知这是由于PHP项目文件中存在带BOM格式文件,导致使用json_encode()编码的json字符串开头会带有"\ufeff",也就是传入了带BOM格式的UTF-8数据,在PHP5.2以后,json_encode()只能接受UTF-8无BOM编码格式的数据。json_decode()解析非UTF-8无BOM格式的数据就会返回null。

解决方法

  1. 方法一(堵漏法)
    既然在json_encode()中传入了带BOM格式的UTF-8数据,导致了问题,那么我们可以在传入参数前,对参数进行一下过滤,也就是移除参数中的BOM,PHP代码如下:
    $result = trim($result, "\xEF\xBB\xBF");
  2. 方法二(治本法)
    导致问题的根本原因是项目中存在带BOM格式的UTF-8文件,那么要从根本上解决问题就必须将带BOM格式文件转换成无BOM格式文件,在linux下可以通过下面两条命令查找带BOM格式文件和将文件转换成无BOM格式:
# 在项目根目录,查找项目中带BOM格式文件并显示
     grep -r -I -l $'^\xEF\xBB\xBF' ./
# 在存在BOM格式文件的目录,将目录下所有文件去除BOM头
# (注意:不能对图片进行此操作,否则会导致图片打不开)
     find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \;
PHP相关
Web note ad 1