Неправильная кодировка кириллицы на выходе - OC 2.0 сторонний модуль и шаблон

Тема в разделе "Обо всём", создана пользователем alexc, 23 сен 2015.

  1. alexc

    alexc Новичок

    Сообщения:
    2
    Симпатии:
    0
    Подскажите, кто-нибудь. В настройках модуля есть код:
    Код:
    <?php require_once(DIR_SYSTEM . 'library/btform.php'); $btform = new Btform(); global $config; ?>
    <?php echo $header; ?><?php echo $column_left; ?>
    <?php if(!empty($slides)){ ?>
    <?php $slideset = json_decode($slides['slideset'], true);?>
    <?php $captions = json_decode($slides['caption'], true);?>
    <?php if(!empty($slider_settings)){$setting = json_decode($slider_settings['setting'], true);}?>
    <?php } ?>
    
    Когда установлены значения полей на англ. - выводится нормально. Как только меняю на русские - слова отображаются в юникоде (типо: u043au0443u043fu0438u0442u044c) Когда удаляю строки кодировки (json) - появляется ошибка. Как убрать кодирование без вреда остальному коду?
     
    Последнее редактирование: 23 сен 2015
  2. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    Наверно у вас изначально в настройках так текст сохранился.
     
  3. alexc

    alexc Новичок

    Сообщения:
    2
    Симпатии:
    0
    нет. Я текст вписываю в поля, которые при сохранении обрабатывает этот кодировщик. Но в коде нужно еще, что бы учитывалась кириллица. Где-то пропущен этот параметр. Вот весь код обработчика json:
    Код:
    <?php
    if (!function_exists('json_encode')) {
        function json_encode($data) {
            switch (gettype($data)) {
                case 'boolean':
                    return $data ? 'true' : 'false';
                case 'integer':
                case 'double':
                    return $data;
                case 'resource':
                case 'string':
                    # Escape non-printable or Non-ASCII characters.
                    # I also put the \\ character first, as suggested in comments on the 'addclashes' page.
                    $json = '';
    
                    $string = '"' . addcslashes($data, "\\\"\n\r\t/" . chr(8) . chr(12)) . '"';
    
                    # Convert UTF-8 to Hexadecimal Codepoints.
                    for ($i = 0; $i < strlen($string); $i++) {
                        $char = $string[$i];
                        $c1 = ord($char);
    
                        # Single byte;
                        if ($c1 < 128) {
                            $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
    
                            continue;
                        }
    
                        # Double byte
                        $c2 = ord($string[++$i]);
    
                        if (($c1 & 32) === 0) {
                            $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
    
                            continue;
                        }
    
                        # Triple
                        $c3 = ord($string[++$i]);
    
                        if (($c1 & 16) === 0) {
                            $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
    
                            continue;
                        }
    
                        # Quadruple
                        $c4 = ord($string[++$i]);
    
                        if (($c1 & 8 ) === 0) {
                            $u = (($c1 & 15) << 2) + (($c2 >> 4) & 3) - 1;
    
                            $w1 = (54 << 10) + ($u << 6) + (($c2 & 15) << 2) + (($c3 >> 4) & 3);
                            $w2 = (55 << 10) + (($c3 & 15) << 6) + ($c4 - 128);
    
                            $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
                        }
                    }
    
                    return $json;
                case 'array':
                    if (empty($data) || array_keys($data) === range(0, sizeof($data) - 1)) {
                        $output = array();
    
                        foreach ($data as $value) {
                            $output[] = json_encode($value);
                        }
    
                        return '[' . implode(',', $output) . ']';
                    }
                case 'object':
                    $output = array();
    
                    foreach ($data as $key => $value) {
                        $output[] = json_encode(strval($key)) . ':' . json_encode($value);
                    }
    
                    return '{' . implode(',', $output) . '}';
                default:
                    return 'null';
            }
        }
    }
    
    if (!function_exists('json_decode')) {
        function json_decode($json, $assoc = false) {
            $match = '/".*?(?<!\\\\)"/';
    
            $string = preg_replace($match, '', $json);
            $string = preg_replace('/[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/', '', $string);
    
            if ($string != '') {
                return null;
            }
    
            $s2m = array();
            $m2s = array();
    
            preg_match_all($match, $json, $m);
    
            foreach ($m[0] as $s) {
                $hash = '"' . md5($s) . '"';
                $s2m[$s] = $hash;
                $m2s[$hash] = str_replace('$', '\$', $s);
            }
    
            $json = strtr($json, $s2m);
    
            $a = ($assoc) ? '' : '(object) ';
    
            $data = array(
                ':' => '=>',
                '[' => 'array(',
                '{' => "{$a}array(",
                ']' => ')',
                '}' => ')'
            );
    
            $json = strtr($json, $data);
    
            $json = preg_replace('~([\s\(,>])(-?)0~', '$1$2', $json);
    
            $json = strtr($json, $m2s);
    
            $function = @create_function('', "return {$json};");
            $return = ($function) ? $function() : null;
    
            unset($s2m);
            unset($m2s);
            unset($function);
    
            return $return;
        }
    }
     
    Последнее редактирование: 24 сен 2015
  4. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    в самой базе посмотрите как записано!

    А тот код который указали, обработчик, он и не нужен т.к в php уже есть данные функции.
     
  5. alexc

    alexc Новичок

    Сообщения:
    2
    Симпатии:
    0
    При сохранении и последующем открытии - слова на русском меняются на юникод. Это западный шаблон - поэтому те, кто создавал его не замарачивались по поводу кириллицы..:(
     
  6. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    я так и не понял. В базе данных записывается на кириллице?? Посмотрите куда записывает модуль..
     
  7. alexc

    alexc Новичок

    Сообщения:
    2
    Симпатии:
    0
    В SQL попадает Юникод. Т.е. вот это: u043au0443u043fu0438u0442u044c
     
  8. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    вот теперь и надо смотреть в контроллер админки модуля..