`

带BOM的utf-8,用json_decode() 返回null的问题 --- 超过3个bom字符

阅读更多

PHP中file_get_contents函数获取URL文件内容时,带BOM的utf-8,用json_decode() 返回null的问题。

网上有二种处理方法:

1、正则

if(preg_match('/^\xEF\xBB\xBF/',$data))    //去除可能存在的BOM
{
    $data=substr($data,3);
}

 

2、自动检测目录下文件并移除BOM

 <?php
if (isset($_GET['dir'])){ //config the basedir
  $basedir=$_GET['dir'];
}else{
  $basedir = '.';
}
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
  if ($dh = opendir($basedir)) {
    while (($file = readdir($dh)) !== false) {
      if ($file != '.' && $file != '..'){
        if (!is_dir($basedir."/".$file)) {
          echo "filename: $basedir/
$file ".checkBOM("$basedir/$file")." <br>";
        }else{
          $dirname = $basedir."/".
$file;
          checkdir($dirname);
        }
      }
    }
  closedir($dh);
  }
}
function checkBOM ($filename) {
  global $auto;
  $contents = file_get_contents($filename);
  $charset[1] = substr($contents, 0, 1);
  $charset[2] = substr($contents, 1, 1);
  $charset[3] = substr($contents, 2, 1);
  if (ord($charset[1]) == 239 && ord($charset[2]) == 187 &&
ord($charset[3]) == 191) {
    if ($auto == 1) {
      $rest = substr($contents, 3);
      rewrite ($filename, $rest);
      return ("<font color=red>BOM found,
automatically removed.</font>");
    } else {
      return ("<font color=red>BOM found.
</font>");
    }
  }
  else return ("BOM Not Found.");
}
function rewrite ($filename, $data) {
  $filenum = fopen($filename, "w");
  flock($filenum, LOCK_EX);
  fwrite($filenum, $data);
  fclose($filenum);
}
?>

 

 本人参考上面二种方法,均无效。

于是把 file_get_contents得到的内容(浏览器上显示的)复制出来,并粘贴进Netbeans空白PHP文件中,发现我的BOM内容根本不至3个字符。。。

于是修改如下:

。。。。//类其他文件,不用理

 

    public static function checkBOM($contents) {        
        $j=0;
        for($i=0;$i<strlen($contents);$i++){
            $charset = ord(substr($contents, $i, 1));
            if($charset==239 || $charset==187 || $charset==191 ){
                $j++;
            }
        }
        $contents = substr($contents, $j);
        return $contents;
    }

。。。。//类其他文件,不用理

 

调用页:

$data = file_get_contents(fileURL);

$data = func::checkBOM($data);    //去除可能存在的BOM
$data = json_decode($data, true);

这样就OK了

分享到:
评论

相关推荐

    PHP 获取JSON json_decode返回NULL解决办法

    PHP 获取JSON json_decode返回NULL解决办法,不小心在返回的json字符串中返回了BOM头的不可见字符,某些编辑器默认会加上BOM头,这样处理才能正确解析json数据

    Json_decode 解析json字符串为NULL的解决方法(必看)

    但是有时候我们会发现,即使是看似完整的JSON字符串,在使用`json_decode()`函数解析后返回的却是NULL,这会让人困惑。这篇文章将会详细探讨在使用PHP的`json_decode()`函数解析JSON字符串遇到NULL返回值时的解决...

    UTF-8.rar_utf_utf gb2312_utf 转换_utf-8_utf-8解码

    对于“UTF-8解码”这个标签,它通常指的是将用UTF-8编码表示的字节序列还原成可读的字符。在处理网络数据或读取二进制文件时,我们需要对获取的字节流进行解码,以理解其中的文本内容。例如,读取一个UTF-8编码的...

    json_decode,json_encode 使用日志(1)

    例如,如果JSON字符串格式不正确,`json_decode`会返回`NULL`。这时可以通过`json_last_error_msg()`函数获取错误信息,或者检查`json_last_error()`返回的错误代码。 此外,为了提高性能,可以考虑在不需要保留...

    json_decode 索引为数字时自动排序问题解决方法.docx

    在给定的例子中,通过`json_encode`函数将一个包含日期和股票信息的复杂结构转换成JSON字符串,并尝试用`json_decode`进行解码。然而,在这个过程中,发现了一些问题: 原始的JSON字符串如下: ```json { "code": ...

    PHP json_encode与json_decode.rar

    使用`json_encode`时,确保数据已经正确编码为UTF-8。 3. `json_decode`返回的PHP对象是stdClass类型的,如果想要得到关联数组,可以设置第二个参数`$assoc`为`true`。 4. `json_last_error_msg()`和`json_last_...

    php-json:函数 json_encode 和 json_decode 用于早期版本的 PHP (&lt; 5.2.0)

    见和系统要求 * PHP* mbstring extension* Charset UTF-8使用 php-json 如果您有错误“调用未定义的函数 json_encode() 或 json_decode()”,只需添加: require_once("phpJson.class.php");或者 require_once(...

    有关json_decode乱码及NULL的问题

    首先,json_decode只支持utf-8格式的编码,如果源数据不是utf-8格式,就会出现乱码,或者返回null。如果你的数据是以gbk格式存储的,那么在使用json_decode之前,你需要使用iconv函数将gbk格式的数据转换成utf-8格式...

    PHP程序设计-3期(KC016) 3.7.2JSON_DECODE课后习题.doc

    然后使用`JSON.stringify()`方法将这个对象转化为JSON字符串,通过POST方式发送到服务器。 服务器端代码使用了PHP的PDO扩展来连接MySQL数据库,并执行插入操作。首先,通过`$_POST['vip']`接收前端传来的JSON字符串...

    PHP程序设计-3期(KC016) 3.7.2JSON_DECODE常见问题.docx

    3. `json_decode()`返回NULL可能意味着输入的不是有效的JSON,或者JSON字符串编码不正确。可以使用`json_last_error_msg()`函数获取错误信息,帮助定位问题。 了解这些常见问题及其解决方案,有助于我们在PHP编程中...

    jQuery JSON with PHP json_encode and json_decode

    在jQuery中,我们可以使用`$.getJSON`方法或者`$.ajax`方法的`dataType: 'json'`选项来获取服务器返回的JSON数据。例如: ```javascript $.getJSON('server_script.php', function(data) { console.log(data.name)...

    php中json_decode()和json_encode()的使用方法.docx

    需要注意的是,JSON编码的数据必须是UTF-8编码的,否则可能导致编码失败。同时,`json_encode()`在处理浮点数时可能会有精度损失,因为JSON标准仅支持IEEE 754双精度浮点数。 总结起来,`json_decode()`和`json_...

    PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠

    如果在进行了上述所有操作后,`json_decode()`函数仍然返回`NULL`,那么可能是因为JSON字符串中存在不可见的特殊字符或者格式问题。这时候需要仔细检查JSON字符串,确保格式的正确性,特别是确保所有的双引号`"`都...

    utf-8 ansi 字符互转 工具

    ansi_text = utf8_text.decode('gbk') # 注意,Windows-1252 在处理中文时通常用GBK或GB2312代替 ``` 2. **使用工具**:针对非程序员或者需要批量转换的场景,有许多第三方工具可以使用。例如“utf-8 ansi 字符互...

    PHP实现json_decode不转义中文的方法

    在上面的例子中,`$json_string` 是一个包含中文字符的JSON字符串,`true` 参数表示我们希望结果是一个关联数组而非对象,`512` 是深度限制(通常可忽略),而 `JSON_UNESCAPED_UNICODE` 参数则确保中文字符不会被...

    PHP程序设计-3期(KC016) 3.7.2JSON_DECODE拓展知识.doc

    函数的基本语法是`json_decode($json_string, $assoc)`,其中`$json_string`是需要解码的JSON字符串,`$assoc`是一个可选参数,用于决定返回类型。 1. **错误处理**: 当JSON解析过程中出现错误,PHP会返回一个...

    DVB-S2_LDPC_decode_recently9on_passawe_matlab_dvb_dvb-s2_

    3. **符号同步**:通过符号同步来确定正确的采样时刻,确保正确解码每个符号。 4. **交织与去交织**:在编码过程中,数据被交织以增加抗突发错误的能力。解码时需要进行去交织操作,恢复原始数据流。 5. **速率匹配*...

    utf-8 互转 gb2312 转码

    对于中文等其他语言,UTF-8使用1到4个字节来表示一个字符,使得它能够处理世界上几乎所有的语言文字。 GB2312,全称为“汉字机内码交换码”,是中国大陆早期的简体中文字符编码标准,主要用于早期的计算机系统和...

    utf8.rar_UTF8_UTF8-gb_big5_delphi_utf8 decode_字符串 转换

    标题中的"utf8.rar_UTF8_UTF8-gb_big5_delphi_utf8 decode_字符串转换"表明这个压缩包可能包含与字符编码转换相关的代码或资源,特别是涉及到UTF8、GBK(GB2312,通常简称为gb)、BIG5以及Delphi编程语言的字符串...

Global site tag (gtag.js) - Google Analytics