27 окт. 2009 г.

Преобразования JSON в PHP

Столкнулся с проблемой преобразования массива данных в PHP для передачи в формате JSON. В PHP есть ф-ция json_encode, но она работает только с данными в кодировке UTF-8, в результате чего пришлось кодировать данные при помощи самописной функции prepareDataForJson:

function prepareDataForJson(&$data)
{
if(is_array($data))
{
foreach(array_keys($data)as $k)
{
prepareDataForJson($data[$k]);
}
}else{
if(isset($data) && $data!='')
{
$data = htmlspecialchars($data);
$data = iconv('CP1251', 'UTF-8', $data);
}
}
}

и после этого передать в json_encode. Результат вывода был в виде \uXXXX, где ХХХХ - 4-х значный символ в UTF-16. Пришлось прогонять данные через самописную функцию unicode_decode :

function unicode_decode($str)
{
return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('UTF-16', 'UTF-8',hex2str(\"$1\"))", $str);
}

function hex2str($hex)
{
return chr(hexdec($hex[2] . $hex[3])) . chr(hexdec($hex[0] . $hex[1]));
}


И только после данных преобразований получился требуемый JSON массив.