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

2015-01-24信息快讯网

这篇文章主要介绍了PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题,json无法正常解析的同学可以看一下,是不是看不见的BOM编码导致的问题,需要的朋友可以参考下

昨天同事遇到一个奇怪的问题,就是以下代码,无法通过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中HTTP_REFERER函数用法实例
PHP中shuffle数组值随便排序函数用法
PHP使用feof()函数读文件的方法
PHP实现UTF-8文件BOM自动检测与移除实例
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
PHP中的output_buffering详细介绍
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Fedora下安装php Redis扩展笔记
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
php批量删除数据库下指定前缀的表以prefix_为例
PHP中feof()函数实例测试
php实现的DateDiff和DateAdd时间函数代码分享
php中隐形字符65279(utf-8的BOM头)问题
PHP中的reflection反射机制测试例子
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
php foreach正序倒序输出示例代码
PHP使用GIFEncoder类处理gif图片实例
PHP使用GIFEncoder类生成gif动态滚动字幕
PHP使用GIFEncoder类生成的GIF动态图片验证码
ThinkPHP模板判断输出Defined标签用法详解
PHP读取RSS(Feed)简单实例
使用php批量删除数据库下所有前缀为prefix_的表
PHP批量检测并去除文件BOM头代码实例
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
php sybase_fetch_array使用方法
PHP批量删除、清除UTF-8文件BOM头的代码实例
php警告Creating default object from empty value 问题的解决方法
使用php清除bom示例
codeigniter教程之上传视频并使用ffmpeg转flv示例
php缓冲 output_buffering和ob_start使用介绍
使用php伪造referer的方法 利用referer防止图片盗链
©2014-2024 dbsqp.com