PHP не сериализируют сбои с незакодированными символами?

$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));
};
28
задан FFish 17 May 2010 в 22:52
поделиться

3 ответа

Причина, по которой 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, который гораздо более стандартизирован.

52
ответ дан 28 November 2019 в 02:14
поделиться

Я бы посоветовал вам использовать javascript для кодирования как json, а затем использовать json_decode для десериализации.

0
ответ дан 28 November 2019 в 02:14
поделиться

Не не используйте сериализацию / десериализацию PHP, если другой конец не является PHP. Он не предназначен для переносимого формата - например, он даже включает символы ascii-1 для защищенных ключей, с которыми вы не хотите иметь дело в javascript (даже если он будет работать отлично, это просто ужасно уродливо).

Вместо этого используйте переносимый формат, например JSON . XML тоже подойдет, но JSON имеет меньше накладных расходов и более удобен для программистов, поскольку вы можете легко преобразовать его в простую структуру данных вместо того, чтобы иметь дело с XPath, деревьями DOM и т. Д.

2
ответ дан 28 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: