PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题

昨天同事遇到一个奇怪的问题,就是以下代码,无法通过json校验,也无法通过PHP的json_decode函数解析。

代码如下:
可能聪明的你已经猜到其中包含有不看见的特殊字符,在vim下查看:
代码如下:
"title": "", "pinyin": "" } ]
发现在“title”前面有一个字符,如果你之前了解过BOM,应该知道这个特殊字符就是BOM,关于其介绍可以参考另一篇文章.

在Linux下通过xxd命令查看文件内容的十六进制:

代码如下:
可以看到刚才那个"title"前面的特殊字符十六进制为:ef bb bf,正是标记UTF-8的BOM。BOM的含义如下:
代码如下:

发现问题解决就很容易了,查找删除BOM就OK了,linux下BOM相关的命令有:

VIM的BOM操作

代码如下:
添加BOM :set bomb #删除BOM :set nobomb #查询BOM :set bomb?

查找UTF-8编码中的BOM

代码如下:
还可以在svn的钩子中禁止提交BOM(以下代码来自网络,没校验)
代码如下:

REPOS="$1" TXN="$2"

SVNLOOK=/usr/bin/svnlook

FILES=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk {'print $2'}`

for FILE in $FILES; do CONTENT=`$SVNLOOK cat -t "$TXN" "$REPOS" "$FILE"`

if echo $CONTENT | head -c 3 | xxd -i | grep -q '0xef,0xbb,0xbf'; then echo "BOM!" 1>&2 exit 1 fi done

最后提醒大家在wowdows下最好别使用记事本等会自动添加BOM的编辑器修改代码,容易引发一些问题。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...