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


Posted in PHP onJuly 02, 2014

昨天同事遇到一个奇怪的问题,就是以下代码,无法通过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创建PDF中文文档
Oct 09 PHP
php部分常见问题总结
Mar 27 PHP
php SQL Injection with MySQL
Feb 27 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
PHP Web表单生成器案例分析
Jun 02 PHP
php foreach正序倒序输出示例代码
Jul 01 #PHP
浅析ThinkPHP的模板输出功能
Jul 01 #PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 #PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 #PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 #PHP
ThinkPHP框架实现session跨域问题的解决方法
Jul 01 #PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 #PHP
You might like
常用PHP框架功能对照表
2014/10/23 PHP
php简单复制文件的方法
2016/05/09 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
php四种定界符详解
2017/02/16 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
php实现等比例压缩图片
2018/07/26 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
Python入门篇之对象类型
2014/10/17 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python怎么判断模块安装完成
2020/06/19 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
个人简历自我评价
2014/02/02 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
小学生作文批改评语
2014/12/25 职场文书
趣味运动会开幕词
2015/01/28 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
人工作失职检讨书
2015/05/05 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript