Причина, по которой unserialize()
терпит неудачу:
$ser = 'a:2:{i:0;s:5:"héllö";i:1;s:5:"wörld";}';
Это потому, что длина для 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, который более стандартизирован.
Context
: