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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
修改了一个很不错的php验证码(支持中文)
Feb 14 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
PHP 与 UTF-8 的最佳实践详细介绍
Jan 04 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
php实现数字补零的方法总结
Sep 12 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python滑块验证码的破解实现
2019/11/10 Python
python关闭占用端口方式
2019/12/17 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
幼师专业求职推荐信
2013/11/08 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
初中音乐教学反思
2014/01/12 职场文书
《海底世界》教学反思
2014/04/16 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
护士医德考评自我评价
2015/03/03 职场文书
民间借贷被告代理词
2015/05/23 职场文书
禁毒主题班会教案
2015/08/14 职场文书
四年级数学教学反思
2016/02/16 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python