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

 更新时间:2014年07月02日 10:35:28   投稿:junjie  
这篇文章主要介绍了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自定义分页类完整实例

    php自定义分页类完整实例

    这篇文章主要介绍了php自定义分页类,以完整实例形式分析了php实现分页功能的原理与具体实现技巧,代码中有详细的注释便于理解,需要的朋友可以参考下
    2015-12-12
  • php文件上传的两种实现方法

    php文件上传的两种实现方法

    这篇文章主要为大家详细介绍了两种php文件上传的实现方法,感兴趣的朋友可以参考一下
    2016-04-04
  • PHP高级对象构建 多个构造函数的使用

    PHP高级对象构建 多个构造函数的使用

    构建对象是PHP面向对象编程设计中的一个重要主题。在最简单的情况下,普通构造函数就够用了,但如果要开展更为复杂的设计,那么构造函数可能会变的难以管理
    2012-02-02
  • PHP中闭包函数的使用详细讲解

    PHP中闭包函数的使用详细讲解

    闭包是一种特殊的函数,可以在函数内部创建一个独立的作用域,以保护变量不受外部环境的影响,下面主要为大家介绍一下PHP中闭包函数的使用,有需要的可以了解下
    2023-11-11
  • CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解

    CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解

    CodeIgniter 是一个小巧但功能强大的 PHP 框架。这篇文章主要介绍了CI框架(ajax分页,全选,反选,不选,批量删除)完整代码,需要的朋友可以参考下
    2016-11-11
  • PHP中session变量的销毁

    PHP中session变量的销毁

    本篇文章主要是对PHP中session变量的销毁进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • 缓存技术详谈—php

    缓存技术详谈—php

    缓存技术详谈—php...
    2006-12-12
  • php数组函数array_walk用法示例

    php数组函数array_walk用法示例

    这篇文章主要介绍了php数组函数array_walk用法,分析了array_walk对数组中每个成员调用用户函数的使用技巧,需要的朋友可以参考下
    2016-05-05
  • PHP中shuffle数组值随便排序函数用法

    PHP中shuffle数组值随便排序函数用法

    这篇文章主要介绍了PHP中shuffle数组值随便排序函数用法,可以比较简单的实现对数组的随机排序,需要的朋友可以参考下
    2014-11-11
  • PHP区块查询实现方法分析

    PHP区块查询实现方法分析

    这篇文章主要介绍了PHP区块查询实现方法,结合实例形式简单分析了php区块查询的概念、原理、实现与使用操作技巧,需要的朋友可以参考下
    2018-05-05

最新评论