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解决办法,不小心在返回的json字符串中返回了BOM头的不可见字符,某些编辑器默认会加上BOM头,这样处理才能正确解析json数据
但是有时候我们会发现,即使是看似完整的JSON字符串,在使用`json_decode()`函数解析后返回的却是NULL,这会让人困惑。这篇文章将会详细探讨在使用PHP的`json_decode()`函数解析JSON字符串遇到NULL返回值时的解决...
对于“UTF-8解码”这个标签,它通常指的是将用UTF-8编码表示的字节序列还原成可读的字符。在处理网络数据或读取二进制文件时,我们需要对获取的字节流进行解码,以理解其中的文本内容。例如,读取一个UTF-8编码的...
例如,如果JSON字符串格式不正确,`json_decode`会返回`NULL`。这时可以通过`json_last_error_msg()`函数获取错误信息,或者检查`json_last_error()`返回的错误代码。 此外,为了提高性能,可以考虑在不需要保留...
在给定的例子中,通过`json_encode`函数将一个包含日期和股票信息的复杂结构转换成JSON字符串,并尝试用`json_decode`进行解码。然而,在这个过程中,发现了一些问题: 原始的JSON字符串如下: ```json { "code": ...
使用`json_encode`时,确保数据已经正确编码为UTF-8。 3. `json_decode`返回的PHP对象是stdClass类型的,如果想要得到关联数组,可以设置第二个参数`$assoc`为`true`。 4. `json_last_error_msg()`和`json_last_...
见和系统要求 * PHP* mbstring extension* Charset UTF-8使用 php-json 如果您有错误“调用未定义的函数 json_encode() 或 json_decode()”,只需添加: require_once("phpJson.class.php");或者 require_once(...
首先,json_decode只支持utf-8格式的编码,如果源数据不是utf-8格式,就会出现乱码,或者返回null。如果你的数据是以gbk格式存储的,那么在使用json_decode之前,你需要使用iconv函数将gbk格式的数据转换成utf-8格式...
然后使用`JSON.stringify()`方法将这个对象转化为JSON字符串,通过POST方式发送到服务器。 服务器端代码使用了PHP的PDO扩展来连接MySQL数据库,并执行插入操作。首先,通过`$_POST['vip']`接收前端传来的JSON字符串...
3. `json_decode()`返回NULL可能意味着输入的不是有效的JSON,或者JSON字符串编码不正确。可以使用`json_last_error_msg()`函数获取错误信息,帮助定位问题。 了解这些常见问题及其解决方案,有助于我们在PHP编程中...
在jQuery中,我们可以使用`$.getJSON`方法或者`$.ajax`方法的`dataType: 'json'`选项来获取服务器返回的JSON数据。例如: ```javascript $.getJSON('server_script.php', function(data) { console.log(data.name)...
需要注意的是,JSON编码的数据必须是UTF-8编码的,否则可能导致编码失败。同时,`json_encode()`在处理浮点数时可能会有精度损失,因为JSON标准仅支持IEEE 754双精度浮点数。 总结起来,`json_decode()`和`json_...
如果在进行了上述所有操作后,`json_decode()`函数仍然返回`NULL`,那么可能是因为JSON字符串中存在不可见的特殊字符或者格式问题。这时候需要仔细检查JSON字符串,确保格式的正确性,特别是确保所有的双引号`"`都...
ansi_text = utf8_text.decode('gbk') # 注意,Windows-1252 在处理中文时通常用GBK或GB2312代替 ``` 2. **使用工具**:针对非程序员或者需要批量转换的场景,有许多第三方工具可以使用。例如“utf-8 ansi 字符互...
在上面的例子中,`$json_string` 是一个包含中文字符的JSON字符串,`true` 参数表示我们希望结果是一个关联数组而非对象,`512` 是深度限制(通常可忽略),而 `JSON_UNESCAPED_UNICODE` 参数则确保中文字符不会被...
函数的基本语法是`json_decode($json_string, $assoc)`,其中`$json_string`是需要解码的JSON字符串,`$assoc`是一个可选参数,用于决定返回类型。 1. **错误处理**: 当JSON解析过程中出现错误,PHP会返回一个...
3. **符号同步**:通过符号同步来确定正确的采样时刻,确保正确解码每个符号。 4. **交织与去交织**:在编码过程中,数据被交织以增加抗突发错误的能力。解码时需要进行去交织操作,恢复原始数据流。 5. **速率匹配*...
对于中文等其他语言,UTF-8使用1到4个字节来表示一个字符,使得它能够处理世界上几乎所有的语言文字。 GB2312,全称为“汉字机内码交换码”,是中国大陆早期的简体中文字符编码标准,主要用于早期的计算机系统和...
标题中的"utf8.rar_UTF8_UTF8-gb_big5_delphi_utf8 decode_字符串转换"表明这个压缩包可能包含与字符编码转换相关的代码或资源,特别是涉及到UTF8、GBK(GB2312,通常简称为gb)、BIG5以及Delphi编程语言的字符串...