массивы json_encode с символами iso-8895 - PullRequest
0 голосов
/ 26 июля 2011

У меня довольно сложный, хотя и не очень большой, массив с множеством уровней вложенности.Массив содержит значения, закодированные в ISO-8895, а также объекты с той же проблемой.Если я просто

 json_encode($array)

PHP закодирую все значения, содержащиеся в символах ISO-8895, как null.

Глядя на документацию PHP, мне удалось написать рабочее решение:1007 *

function fixMultibyteSerializedObject($match)
{
    return 's:' . mb_strlen($match[2]);
}
/**
 * Useful to json-encode arrays of objects with ISO-8895 encoded values.
 * Does not work with iso-encoded keys
 * @param var $object array or object to be encoded
 * @param int $options json_encode options
 */
function isoJsonEncode($object, $options = null)
{
    $str = serialize($object);
    $str = mb_convert_encoding($str, 'utf-8');
    $str = preg_replace_callback(
            '!(?<=^|;)s:(\d+)(?=:"(.*?)";(?:}|a:|s:|b:|d:|i:|o:|N;))!s',
             'fixMultibyteSerializedObject',
            $str);
    $object = unserialize($str);
    return json_encode($object, $options);
}

Помимо получения лучшей библиотеки, такой как компонент кодирования Zend json, можете ли вы предложить лучшее решение?

Спасибо, Iacopo

1 Ответ

2 голосов
/ 26 июля 2011

Как насчет этого?

array_walk_recursive($array, function (&$elem) {
    if (is_string($elem)) {
        $elem = iconv('ISO-8895', 'UTF-8', $elem);
    }
});

echo json_encode($array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...