PHP中遇到BOM、编码导致json_decode函数无法解析问题
程序员文章站
2022-06-30 09:31:58
昨天同事遇到一个奇怪的问题,就是以下代码,无法通过json校验,也无法通过php的json_decode函数解析。
复制代码 代码如下:
[
...
昨天同事遇到一个奇怪的问题,就是以下代码,无法通过json校验,也无法通过php的json_decode函数解析。
复制代码 代码如下:
[
{
"title": "",
"pinyin": ""
}
]
可能聪明的你已经猜到其中包含有不看见的特殊字符,在vim下查看:
复制代码 代码如下:
[
{
<feff>"title": "",
"pinyin": ""
}
]
发现在“title”前面有一个字符<feff>,如果你之前了解过bom,应该知道这个特殊字符就是bom,关于其介绍可以参考另一篇文章:计算机中的字符串编码、乱码、bom等问题详解.
在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 : "". }.].
可以看到刚才那个"title"前面的特殊字符十六进制为:ef bb bf,正是标记utf-8的bom。bom的含义如下:
复制代码 代码如下:
开头字节 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
还可以在svn的钩子中禁止提交bom(以下代码来自网络,没校验)
复制代码 代码如下:
#!/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
最后提醒大家在wowdows下最好别使用记事本等会自动添加bom的编辑器修改代码,容易引发一些问题。
下一篇: php计算数组不为空元素个数的方法
推荐阅读
-
PHP中遇到BOM、
编码导致json_decode函数无法解析问题 -
PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题_PHP教程
-
PHP中遇到BOM、feff编码导致json_decode函数无法解析问题
-
PHP中遇到BOM、
编码导致json_decode函数无法解析问题_php技巧 -
PHP中遇到BOM、
编码导致json_decode函数无法解析问_PHP -
PHP中遇到BOM、
编码导致json_decode函数无法解析问_PHP -
PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题_PHP教程
-
PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题
-
PHP中遇到BOM、
编码导致json_decode函数无法解析问题_php技巧