unserialize(): Error at offset出现的原因分析以及解决方法
来源:互联网 发布:ccs软件百度云 编辑:程序博客网 时间:2024/05/22 05:05
unserialize(): Error at offset出现的原因分析以及解决方法
在PHP的unserialize函数使用中,当字符串或数据库中取出的数据有中文的时候,会出现如下错误
Notice: unserialize(): Error at offset xx of xxx bytes in C:\toolmao\php\index.php on line21
说到中文,我们肯定第一时间想到编码,那么让我们看看不同文件编码下 serialize 函数对中文的处理是怎么样的,用同一段代码,文件用不同编码来测试
echo serialize(array('name'=>'工具猫','url'=>'http://www.toolmao.com/'));
首先看看UTF8的效果,我们发现 中文 “工具猫”的长度是 9
而文件编码是GB2312的时候,中文“工具猫”的长度是 6
所以当我们取出数据库编码为GBK等中文编码,后又用转码函数转成UTF8后,再用unserialize函数时,因为中文在不同编码下的长度不同,就会出现这个问题了。有人可能会说,数据库取出的时候 SET NAMES 不就行了,但有些数据库(比如access和sqlite)是不支持这样操作的。所以编码不符的时候,必须取出数据转码了。那么具体要如何操作呢?接下来就讲解决方案:
上面我们已经知道了unserialize出现Error at offset报错的成因,那么解决起来就简单了,用正则函数把错误的长度替换掉就可以了,网上已经有大神给出了现成的代码:
unserialize(preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $string))出自:http://www.phpddt.com/php/unserialize-error-at-offset.html
但是由于php的原因,/e 模式存在漏洞,所以php5.5以后取消了这样的用法,所以使用php5.5+的小伙伴们不要急,这里提供另一个解决方案
preg_replace_callback('#s:(\d+):"(.*?)";#s',function($match){return 's:'.strlen($match[2]).':"'.$match[2].'";';},$data);
以上为本人实际开发中碰到的问题,结合网上的解决方案和自己的实际情况最终写出的代码,希望对大家有所帮助!
1 0
- unserialize(): Error at offset出现的原因分析以及解决方法
- PHP unserialize出现Error at offset错误
- Notice: unserialize() [function.unserialize]: Error at offset解决方法
- PHP出现Notice: unserialize() [function.unserialize]: Error at offset问题的解决方案
- PHP出现Notice: unserialize() [function.unserialize]: Error at offset问题的解决方案
- PHP出现Notice: unserialize() [function.unserialize]: Error at offset问题的解决方案
- PHP出现Notice: unserialize(): Error at offset解决方案 【转载】
- PHP中Notice: unserialize(): Error at offset 109 of 615 bytes in on line 的解决方法
- unserialize() [function.unserialize]: Error at offset ecshop 原因是字符串太大了。
- Notice: unserialize(): Error at offset 134526789 of 2136547489 bytes in file.php on line 130
- SIM900A 发送AT+CSTT 总是 返回Error的原因分析
- 关于Android Force Close 出现的原因 以及解决方法
- argument type mismatch出现的原因,以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- tomcat出现闪屏现象的原因以及解决方法总结
- 关于Android Force Close 出现的原因 以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- MTK CCT之CAMERA TUNNING调试学习总结
- 基于Spring Boot 实现定时任务
- linux初识之 linux是什么
- 内存泄漏分析一
- 什么是前端组件化,模块化?
- unserialize(): Error at offset出现的原因分析以及解决方法
- 计算机图形学 - 全斜率Bresenham直线生成算法
- Python基础
- 计算机图形学 - 全斜率直线中点生成算法
- 计算机图形学 - 圆的中点生成算法验证
- 计算机图形学 – 椭圆的中点生成算法
- 计算机图形学 - 抛物线的中点生成算法
- 一个简单的Android Service实例,包括:bindService、IntentService
- 计算机图形学 - 扫描线种子填充算法