$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>";
Но почему?
Я должен закодировать прежде serialzing, чем? Как?
Я использую 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";}';
Это потому, что длина для 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, который гораздо более стандартизирован.
Я бы посоветовал вам использовать javascript для кодирования как json, а затем использовать json_decode для десериализации.
Не не используйте сериализацию / десериализацию PHP, если другой конец не является PHP. Он не предназначен для переносимого формата - например, он даже включает символы ascii-1 для защищенных ключей, с которыми вы не хотите иметь дело в javascript (даже если он будет работать отлично, это просто ужасно уродливо).
Вместо этого используйте переносимый формат, например JSON . XML тоже подойдет, но JSON имеет меньше накладных расходов и более удобен для программистов, поскольку вы можете легко преобразовать его в простую структуру данных вместо того, чтобы иметь дело с XPath, деревьями DOM и т. Д.