Дело в том, что php_json обрабатывает только ISO-8859-1, а остальные символы отбрасывает. Функция
utf8_encode()
тоже не подходит из-за того, что неправильно определяет код символа. Например, русская буква "а" имеет код \u0434
, а utf8_encode()
кодирует ее как \u00e4
. В итоге - на странице кракозябры.Положение спасает
iconv()
: iconv('cp1251', 'utf-8', $string)
. Преобразование корректное. Но, к сожалению, это исключает использование функции json_encode()
"как есть" - придется написать свою функцию json_safe_encode() для кодирования данных в формат JSON:function json_safe_encode($var)PS.
{
return json_encode(json_fix_cyr($var));
}
function json_fix_cyr($var)
{
if (is_array($var)) {
$new = array();
foreach ($var as $k => $v) {
$new[json_fix_cyr($k)] = json_fix_cyr($v);
}
$var = $new;
} elseif (is_object($var)) {
$vars = get_object_vars($var);
foreach ($vars as $m => $v) {
$var->$m = json_fix_cyr($v);
}
} elseif (is_string($var)) {
$var = iconv('cp1251', 'utf-8', $var);
}
return $var;
}
На www.json.org масса полезных ссылок.
UPD 2008-02-06:
$vars = get_object_vars($var);
instead of $vars = get_class_vars(get_class($var));
. Thanks to Pascal Martineau