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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
dedecms系统常用术语汇总
Apr 03 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
Sep 27 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
PHP常量define和const的区别详解
May 18 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
学习php分页代码实例
2013/10/24 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
jQuery TextBox自动完成条
2009/07/22 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
js实现每日签到功能
2018/11/29 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
Python中不同进制的语法及转换方法分析
2016/07/27 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
公安机关纪律作风整顿剖析
2014/10/10 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js