json_decode и Кирилица

PHP
Сегодня с толкнулся с некорректной работой функции json_decode с кирилицей.

Проект написан на cp1251 и как вы смогли понять очень сильно усложнил жизнь своим доработчикам.

Итак, имеем следующий код:
header("Content-Type: text/html; charset=windows-1251");
$a = '{"sKey": "value", "aKey":{"lat":"abc", "cyr":"Кирилица"}}';
$a = json_decode($a, true);
print_r($a);

После выполнения кода на экране мы ничего не увидим. Пусто!
Попробуем удалить кирилицу и посмотреть что будет:
header("Content-Type: text/html; charset=windows-1251");
$a = '{"sKey": "value", "aKey":{"lat":"abc", "cyr":""}}';
$a = json_decode($a, true);
print_r($a);

На выходе получили:
Array
(
    [sKey] => value
    [aKey] => Array
        (
            [lat] => abc
            [cyr] => 
        )

)

Теперь все понятно. Дело в кирилице.
Погуглив можно найти, что json_decode нормально работает с uft8. Попробуем тогда следующий ход:
header("Content-Type: text/html; charset=windows-1251");
$a = '{"sKey": "value", "aKey":{"lat":"abc", "cyr":""}}';
iconv('cp1251', 'utf8', $a);
$a = json_decode($a, true);
print_r($a);

В итоге опять пусто. Почему? Ведь проект на cp1251 и мы все нормально перевели. Тогда попробуем выяснить текущую кодировку.
$a = '{"sKey": "value", "aKey":{"lat":"abc", "cyr":""}}';
echo mb_detect_encoding($a);

Результат utf8. Как? Ведь файл в кодировке cp1251. Ну да ладно изобретем велосипед!

После ряда некоторых экспериментов было выявлено что если этот псевдо utf8 конвертировать из cp1251 опять в utf8, то функция json_decode сработает нормально и результат будет выглядеть вот так:
Array
(
    [sKey] => value
    [aKey] => Array
        (
            [lat] => abc
            [cyr] => кирилица
        )

)


В результате в муках родилось вот такое решение)
header("Content-Type: text/html; charset=windows-1251");
$a = '{"sKey": "value", "aKey":{"lat":"abc", "cyr":""}}';
$a = jsondecode($a);

function jsondecode ($sText){
    if (!$sText) return false;
    $sText = iconv('cp1251', 'utf8', $sText);
    $aJson = json_decode($sText, true);
    $aJson = iconvarray($aJson);
    return $aJson;
}

function iconvarray($aJson){
    foreach ($aJson as $key => $value) {
        if (is_array($value)) {
            $aJson[$key] = iconvarray($value);
        } else {
            $aJson[$key] = iconv('utf8', 'cp1251', $value);
        }
    }
    return $aJson;
}

Результат:
Array
(
    [sKey] => value
    [aKey] => Array
        (
            [lat] => abc
            [cyr] => кирилица
        )

)
Понравился пост? Поделись с друзьями:

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.