这篇文章主要介绍了PHP中遇到BOM、feff编码导致json_decode函数无法解析问题,json无法正常解析的同学可以看一下,是不是看不见的BOM编码导致的问题,需要的朋友可
昨天同事遇到一个奇怪的问题,就是以下代码,无法通过JSON校验,也无法通过PHP的json_decode函数解析。
复制代码 代码如下:
[
{
"title": "",
"pinyin": ""
}
]
复制代码 代码如下:
[
{
"pinyin": ""
}
]
在Linux下通过xxd命令查看文件内容的十六进制:
复制代码 代码如下:
0000000: 5b 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 [. {.
0000010: ef bb bf 22 74 69 74 6c 65 22 3a 20 22 22 2c 0a ..."title": "",.
0000020: 20 20 20 20 20 20 20 20 22 70 69 6e 79 69 6e 22 "pinyin"
0000030: 3a 20 22 22 0a 20 20 20 20 7d 0a 5d 0a : "". }.].
复制代码 代码如下:
开头字节 Charset/encoding
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian(UTF-16LE)
FF FE UTF-16/UCS-2, big endian(UTF-16BE)
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endia
发现问题解决就很容易了,,查找删除BOM就OK了,linux下BOM相关的命令有:
VIM的BOM操作
复制代码 代码如下:
#添加BOM
:set bomb
#删除BOM
:set nobomb
#查询BOM
:set bomb?
查找UTF-8编码中的BOM
复制代码 代码如下:
grep -I -r -l $'\xEF\xBB\xBF' /path
复制代码 代码如下:
#!/bin/sh
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