当前位置: 首页 > 面试题库 >

PHP反序列化失败,并出现非编码字符?

冉弘化
2023-03-14
问题内容
$ser = 'a:2:{i:0;s:5:"héllö";i:1;s:5:"wörld";}'; // fails
$ser2 = 'a:2:{i:0;s:5:"hello";i:1;s:5:"world";}'; // works
$out = unserialize($ser);
$out2 = unserialize($ser2);
print_r($out);
print_r($out2);
echo "<hr>";

但为什么?
我应该在序列化之前编码吗?怎么样?

我使用Javascript将序列化的字符串写入隐藏字段,而不是PHP的$ _POST
在JS中我有类似的东西:

function writeImgData() {
    var caption_arr = new Array();
    $('.album img').each(function(index) {
         caption_arr.push($(this).attr('alt'));
    });
    $("#hidden-field").attr("value", serializeArray(caption_arr));
};

问题答案:

unserialize()失败的原因:

$ser = 'a:2:{i:0;s:5:"héllö";i:1;s:5:"wörld";}';

是因为for的长度héllöwörld是错误的,因为PHP本身无法正确处理多字节字符串:

echo strlen('héllö'); // 7
echo strlen('wörld'); // 6

但是,如果您尝试unserialize()使用以下正确的字符串:

$ser = 'a:2:{i:0;s:7:"héllö";i:1;s:6:"wörld";}';

echo '<pre>';
print_r(unserialize($ser));
echo '</pre>';

有用:

Array
(
    [0] => héllö
    [1] => wörld
)

如果使用PHP,serialize()它应该正确计算多字节字符串索引的长度。

另一方面,如果要使用多种(编程)语言处理序列化数据,则应将其忘记,而转而使用JSON(JSON)之类的方法,该方法更加标准化。



 类似资料:
  • 有没有一种方法可以正确地反序列化以双引号开头和结尾的JSON字符串? 数据以流的形式输入(来自AWS S3对象)。这是流的内容(注意开头和结尾的双引号字符): JsonSerializer似乎没有正确地反序列化它。但是,对于以下内容,其工作原理与预期一致: 以下是片段:

  • 我正在尝试使用apache camel jackson xml对xml进行反序列化,然后发生了一些奇怪的事情,我无法解释。这是我正在尝试反序列化的xml(它是简单的xmltd v xml文件): 这是我的POJO: 电视。Java语言 程序Java语言 Credits.java 其他POJO并不重要。下面是路由配置: 使用此设置和我在开始时提供的xml,会发生以下异常: 通用域名格式。faster

  • 问题内容: 我正在使用Newtonsoft.Json将Web服务的输出反序列化到对象。在我向我的课程(名为)添加一个属性以保存化身之前,它一直运行良好。 Web服务正按预期返回该属性作为Base64字符串。问题是当我尝试将JSON从WS转换回a时,在此代码块中引发了a : 异常的输出是: 并查看内部异常: 显然,它无法解析Base64字符串,但不清楚原因。 有任何想法/解决方法吗? 编辑 我知道我

  • 我有以下JSON: 这基本上是一个包含项集合的对象。 所以我做了一个类来反序列化: 我尝试添加,但没有成功。 怎么走?

  • 我正在尝试让Tomcat在关机时坚持我的会话。我已经解决了这样一个要求,即我在会话中存储的所有内容都是可序列化的,当我在Eclipse下运行Tomcat时,这很好:当代码更改迫使Eclipse重新加载webapp时,会话现在仍然存在。 然而,当我试图在一个独立的Tomcat中做同样的事情时,我遇到了一个问题。 我取消了${catalina.base}/conf/context.xml中的Manag

  • 将有更多的类(不同的产品)扩展。 当我使用序列化它时, 这是输出: 将引发此异常: java.lang.IllegalArgumentException:意外的标记(VALUE_STRING),应为field_name:缺少包含类型id(类com.shubham.model.product的)的属性“type”,位于[源:n/a;行:-1,列:-1] 我在这里做错了什么?我观察了一下,发现了一个问