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 ...
随机推荐
- [Javascript] Hositing
First, memory is set aside for all necessary variables and declared functions. Function expression n ...
- URL参数转换对象
var parseQueryString = function (url) { var reg_url = /^[^\?]+\?([\w\W]+)$/, reg_para = /([^&=]+ ...
- jquery文字填写自动高度
下面开始写一个jquery插件 (function($){ $.fn.autoTextarea = function(options) { var defaults={ maxHeight:null, ...
- Jsp之神笔记
JSP笔记 Tomcatserver port: port就是指的某一个程序网络入口,Tomcat的初始化port为:8080: port的个数:256*256=65536个: 一般常见协议的缺省po ...
- PHP 表单和用户输入
PHP 的 $_GET 和 $_POST 用于检索表单中的值,比如用户输入. index.php页面 <?php /*时间:2014-09-14 *作者:葛崇 *功能:表单传值小实例 * ...
- POJ1679 The Unique MST 【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20421 Accepted: 7183 D ...
- springmvc自己定义拦截器
Spring MVC也能够使用拦截器对请求进行拦截处理,用户能够自己定义拦截器来实现特定的功能,自己定义的拦截器必须实现HandlerInterceptor接口. 直接看下样例: package co ...
- Eclipse 如何导入MyEclipse的项目
Eclipse 如何导入MyEclipse的项目 CreateTime--2018年3月8日09:53:55 Author:Marydon 1.Eclipse导入MyEclipse的项目方法,跟导 ...
- 前端开发不容错过的jQuery图片滑块插件(转)
作为前端开发者,我们会碰到很到各种各样的jQuery插件.今天要分享的几款jQuery图片滑块插件,也就是jQuery焦点图插件,基本上会在每个网站都有应用,可以下载看看,也许你可以用到. 1.jQu ...
- 对UserDict的研究
# -*- coding: utf-8 -*- #python 27 #xiaodeng #对UserDict的研究 class UserDict(): def __init__(self, dict ...