我们在使用 PHP 序列化/反序列化时遇到了一个奇怪的问题。我们已经序列化并存储在 mysql 中的特定字符串中(UTF-8 排序规则)。反序列化时会返回错误。
例如:
输入字符串:
“Anoop 出色地从杂志上剪下了照片 以字母 P 开头。“
数据库中的序列化数据:
s:96:“Anoop 从杂志上剪下图片做得很好 以字母 P 开头。”;
反序列化时,我们收到此错误:
注意 - unserialize ():在 101 字节的偏移 2 处出错。
我们注意到字符串长度不同。造成这个问题的原因是什么?
您的连接中可能没有使用 utf-8 或者您的 PHP 上下文不是 utf-8?
尝试使用SQL:
SET CLIENT_ENCODING = utf8
在您获取数据之前。
尝试/验证:
ini_set ('default_charset' , 'UTF-8' );
setlocale (LC_ALL, 'de_DE.UTF-8'); # or what your favorit
你看到第二个字符串中有一个分号了吗? UTF-8并不总是使用1个字节,它是1到4个字节。
从数据库中解码字符串时,请确保输入到数据库时使用正确的字符集进行编码。
我正在使用一个表单在数据库中创建记录,该记录的内容字段是有效的 JSON,但其中包含大撇号。如果带有表单的页面没有
在头部,然后数据以错误的编码发送到数据库。然后,当 json_decode 尝试将字符串转换为对象时,每次都失败。
PHP 序列化/反序列化没有问题,
就是这样做
$string = "Anoop did a great job cutting out pictures from the magazine that started with the letter P. ";
echo $string = serialize($string);
echo '<br>';
echo unserialize($string);
那就没有错误了。
如果您直接输入
unserialize
字符串,则会显示与之前显示的相同的错误。
$string = "Anoop did a great job cutting out pictures from the magazine that started with the letter P. ";
//echo $string = serialize($string);
echo '<br>';
echo unserialize($string);
这对我有用,你会尝试这个。