我有一个非常复杂的,即使不是很大的数组,有很多级别的嵌套。 该数组包含以ISO-8895编码的值,以及具有相同问题的对象。 如果我只是
json_encode($array)
PHP会将ISO-8895字符的所有值静默编码为null
。
查看PHP文档,我设法编写了一个可行的解决方案:
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
答案 0 :(得分:2)
这样的事情怎么样?
array_walk_recursive($array, function (&$elem) {
if (is_string($elem)) {
$elem = iconv('ISO-8895', 'UTF-8', $elem);
}
});
echo json_encode($array);