php序列化与反序列化时字符集不一致问题的解决办法
今天的用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
function mb_unserialize($serial_str) {
$out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
return unserialize($out);
}
测试过该方法 确实挺管用
PHP比较麻烦的非属编码问题不可了,我们在处理字符问题的时候,很多函数都要我们自己进行自定义重写,所以不是统一编码的好一点.
转:https://www.cnblogs.com/beanmoon/p/3568734.html
作者遇到的问题是:ecshop 一直循环登录,$_SESSION 存储不上(具体应该是存到数据库的session表了,但是反序列化的时候false,所以表现为,session没存上或丢失了)
php序列化与反序列化时字符集不一致问题的解决办法的更多相关文章
- .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
"/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...
- 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错
如题 报错提示: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值.","Sta ...
- MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错
MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...
- JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string u ...
- 爬虫爬数据时,post数据乱码解决办法
最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler. F ...
- Bootstrap中关闭第二个模态框时出现的问题和解决办法
Bootstrap中关闭第二个模态框时出现的问题和解决办法 1.关闭第二个模态框时,第一个模态框跟着消失. 解决办法: 第二个模态框的代码不要写在第一个模态框里面,确保两个模态框相对独立; 2.关闭第 ...
- oracle执行update语句时卡住问题分析及解决办法
转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...
- 返回xml过长时被nginx截断的解决办法
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
随机推荐
- mssql2008R2 RCU-6083:ALTER database FWC SET READ_COMMITTED_SNAPSHOT ON
RCU-6083:失败 - 检查所选组件的先决条件要求:MDS 有关详细资料, 请参阅 E:\Setup\ofm_rcu\rcu\log\logdir.2014-11-27_12-39\rcu.log ...
- TotalCommander如何比较文件夹并提取出重复的文件
1 如图所示,我左侧有一万本多小说,右侧有两千五百多本小说,我希望比较这两个文件夹相同的小说并剪切到一个新的文件夹中. 2 我们使用Total Commander对比这两个文件夹 3 随后两个文件夹相 ...
- Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...
- HttpContext.Current.Cache 和 HttpRuntime.Cache
HttpRuntime.Cache:用于winfrom 和 web HttpContext.Current.Cache 用于web .NET中Cache有两种调用方式:HttpContext.Curr ...
- android google map v1 v2 v3 参考
V1,V2已经不被推荐使用,谷歌强烈推荐使用V3. 本人在选择时着实纠结了良久,现在总结如下: 对于V1,现在已经申请不到API KEY了,所以不要使用这个版本.这个是网址:https://devel ...
- ls命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/10/23/2734829.html ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下l ...
- [2014.5.13][Ubuntu] Ubuntu 14.04STL 出现NTFS分区无法訪问的问题
5.12 为了给学生改论文,在UPC上登录了Windows 8.1,晚上正常关机.今日切换登陆Ubuntu 14.04分区,发现原来能够正常訪问的windows下的NTFS分区都被锁死.提演示样例如以 ...
- 文本框只支持数字、小数点、退格符、负号、Del键
Public Function OnlyNumberAndDot(inKeyAscii As Integer) As Integer '函数说明:文本框只支持数字.小数点.退格符.负号.Del键 '入 ...
- Android中保存静态秘钥实践(转)
本文我们将讲解一个Android产品研发中可能会碰到的一个问题:如何在App中保存静态秘钥以及保证其安全性.许多的移动app需要在app端保存一些静态字符串常量,其可能是静态秘钥.第三方appId等. ...
- eclipse 如何运行mavenWeb项目
1.使用maven 首先,在eclipse中,使用maven对项目进行打包: 其次,将项目发布到Tomcat服务器上 说明: demo_WebService2-0.0.1-SNAPSHOT文件夹存 ...