注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

记录~~~

Stay Hungry. Stay Foolish.

 
 
 

日志

 
 

PHP出现Notice: unserialize(): Error at offset解决方案 【转载】  

2014-02-18 09:04:39|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转自

http://hi.baidu.com/treejames/blog/item/cb0eb512ce24999b6538dbf2.html

今天的用PHP的时候无意的出现了用unserialize()函数转换老是返回false,我确认我的字符串是没错的,测试了很多次还是一样,没办法,启用了error_reporting(E_ALL)启用错误信息,没想到发现了Notice: unserialize() [function.unserialize]: Error at offset的信息, 因为我字符我是从数组转换过来的,所以应该是没有错的, Google了一下,原来是编码问题,在PHP手册的评论中有人讨论了此问题.

原来我的字符串是从数据库里取出来的,而原来插入数据库时我的PHP用的是ANSCII编辑,而我复制出来后用unserialize()的PHP文件是UTF-8编码,编码不同,所以就出现错误了.

例子:
首页以ANSCII方式操作

<?php
$arr = array('en' => 'hello', 'cn' => '您好');
$str = serialize($arr);
echo $str;
?>

输出结果:

a:2:{s:2:”en”;s:5:”hello”;s:2:”cn”;s:4:”您好”;}

然后以UTF-8的编码方式来测试

则以上代码的输出结果为:

a:2:{s:2:”en”;s:5:”hello”;s:2:”cn”;s:6:”您好”;}

看到有什么不同了吧,在出现中文字符时字符长度就不一样了,也就是strlen(‘您好’)在第一种编码中是4,而在第二种编码中是6,其中原因可以查看相关手册. 而unsrialize()要根据类似 s:6:”您好” 中的6来判断字符长度并进行反序列,但原来的是4,字符长度不符,也就是出现了offset错误
解决办法:
将要反序列的字符串进行一次转换,代码

$str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $str );

或者用自己自定的函数来代替unserialize

<?php
function mb_unserialize($serial_str) {
$out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
return unserialize($out);
}



  评论这张
 
阅读(106)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017