当前位置: 首页 > 编程笔记 >

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

步骏
2023-03-14
本文向大家介绍PHP中遇到BOM、 编码导致json_decode函数无法解析问题,包括了PHP中遇到BOM、 编码导致json_decode函数无法解析问题的使用技巧和注意事项,需要的朋友参考一下

昨天同事遇到一个奇怪的问题,就是以下代码,无法通过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的编辑器修改代码,容易引发一些问题。

 类似资料:
  • 问题内容: 我从python接收到一个json数组,作为PHP中curl_exec的返回(第一个json PHP-> python,它返回另一个json),并且由于语法错误而解码失败。收到的json是有效的,但是以某种方式,如果我将此json转换为字符串并将其打印,则会得到一个包含29个字符的字符串,但是如果我打印strlen((string)$ my_json),它将显示50。 这是代码: 然后

  • 问题内容: 我需要具有当前选定的行ID才能构建一个JSON字符串,该字符串将传递给php脚本以创建一个选择,因此我将脚本引用和代码封装在一个函数中。 但是,这样做会产生错误。 这是代码段: 有人知道发生了什么吗? 更新: 问题答案: 该属性不能是一个函数。如果在建立select期间需要将任何其他信息发送到服务器,则可以使用ajaxSelectOptions选项,如我在此所述。在您的情况下,将涉及以

  • 问题内容: Apache正在记录日志。经过一番谷歌搜索,似乎这个问题是由于没有最新版本的php导致的。奇怪的是,运行输出 清楚表明我的版本大于。 关于什么可能导致这种情况的任何想法,或者要采取哪些措施找出答案? 编辑:脚本回显phpversion的结果是 编辑:的结果也是 此外,在中,它列出了模块JSON和模块作者(Omar Kilani,Scott MacVicar)。 问题答案: 简短答案:

  • 我想开始一个新泽西州的项目,但因为pom,我第一步就失败了。xml显示一些错误,无法生成项目。错误: 这是我的pom。xml: 你能帮我解决这个问题吗?我尝试了很多配置,但主题都不起作用。我不知道我的IDE配置(IntelliJ)是否有问题。非常感谢。

  • 我使用以下源代码创建了自己的SDF模式:https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/text/simpledateformat.html 导致以下错误,我不明白原因: 任何帮助都会很棒! 编辑:我正在使用JDK 13 进程结束,退出代码为%1

  • 问题内容: 我试图从提供格式数据的Web服务请求天气。我的PHP请求代码失败了: 这是返回的一些数据。为了简洁起见,一些细节已被截断,但保留了对象完整性: 问题答案: 这似乎起作用: 如果将json_decode的第二个参数设置为true,则会得到一个数组,因此无法使用->语法。我还建议您安装JSONview Firefox扩展 ,以便您可以以类似于 Firefox显示XML结构的漂亮格式的树状视