找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 793|回复: 0
打印 上一主题 下一主题

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

[复制链接]

2588

主题

2588

帖子

7694

积分

论坛元老

Rank: 8Rank: 8

积分
7694
跳转到指定楼层
楼主
发表于 2018-2-14 05:56:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            昨天同事遇到一个奇怪的问题,就是以下代码,无法通过JSON校验,也无法通过PHP的json_decode函数解析。
[U]复制代码[/U] 代码如下:
[
    {
        "title": "",
        "pinyin": ""
    }
]
可能聪明的你已经猜到其中包含有不看见的特殊字符,在vim下查看:
[U]复制代码[/U] 代码如下:
[
    {
        "title": "",
        "pinyin": ""
    }
]
发现在“title”前面有一个字符,如果你之前了解过BOM,应该知道这个特殊字符就是BOM,关于其介绍可以参考另一篇文章:计算机中的字符串编码、乱码、BOM等问题详解.
在Linux下通过xxd命令查看文件内容的十六进制:
[U]复制代码[/U] 代码如下:
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的含义如下:
[U]复制代码[/U] 代码如下:
开头字节            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操作
[U]复制代码[/U] 代码如下:
#添加BOM
:set bomb
#删除BOM
:set nobomb
#查询BOM
:set bomb?
查找UTF-8编码中的BOM
[U]复制代码[/U] 代码如下:grep -I -r -l $'\xEF\xBB\xBF' /path
还可以在svn的钩子中禁止提交BOM(以下代码来自网络,没校验)
[U]复制代码[/U] 代码如下:
#!/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中json_decode()和json_encode()的使用方法
  • Javascript生成json的函数代码(可以用php的json_decode解码)
  • PHP json_decode函数详细解析
  • 浅析php中json_encode()和json_decode()
  • php5.2以下版本无json_decode函数的解决方法
  • 关于php中的json_encode()和json_decode()函数的一些说明
  • php json_encode与json_decode详解及实例
  • PHP实现json_decode不转义中文的方法
  • 使用PHP json_decode可能遇到的坑与解决方法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端