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实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
PHP编程函数安全篇
Jan 08 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
php微信开发之图片回复功能
2018/06/14 PHP
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
Python 装饰器深入理解
2017/03/16 Python
python3之微信文章爬虫实例讲解
2017/07/12 Python
python验证码识别实例代码
2018/02/03 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
大学生先进事迹材料
2014/02/16 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
环保建议书400字
2014/05/14 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
开学第一周值周总结
2015/07/16 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
iPhone13再次曝光
2021/04/15 数码科技
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python