Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с руской кодировкой в функции json_encode 
V
    Опции темы
taral
Дата 2.7.2008, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



У меня возникла огромная проблема. Функция json_encode() не работает с русским текстом. Она его пропускает. Тут проблема с кодировкой. Но я ee решить не могу. Если сохраняю php файл в кодировке ANSI json_encode() не работает но strlen(‘слон’); выводит 4 и нормально работает strtoupper(). Если сохраняю в UTF-8 то функция strlen(‘слон’); выводит 8 и strtoupper(‘привет’) выводит ЯрШвет но json_encode() работает... Да и при кодеровке UTF-8  если в функции preg_replace() использую русские буквы выводит вот что: 
Message: preg_replace() [function.preg-replace]: Compilation failed: range out of order in character class at offset 14
Причина видно кроется в том, что у меня ноутбук с официальной английской вистой. Но конкретно в чем я не знаю). Пожалуйста подскажите как решить проблему(((
Операционная система у меня Vista Home Premium (English)
Пишу код в Adobe Dreamweaver CS3
Сервер Денвер-3 2007-12-19
PM MAIL   Вверх
skyboy
Дата 2.7.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



бугога.
на форуме десятки тем про проблемы кодировок.
в мане по означенным функциям тонны коментариев и полдесятка ссылок на описания.
и все равно ты считаешь, что проблема в Висте. мило.
значит так.
кодировка, используемая для функций str*(strtoupper, strstr и т.д.) задается при помощи setlocale
если уверен, что строки будут в unicode(utf-8, utf-16 и т.д.), то вместо функций str* используй аналоги функций из серии mb_*
чтоб регулярки работали с юникодом, надо указать модификатор u

Добавлено через 40 секунд
ты уж прости мою веселость. просто ты наступил на все грабли, которые смог найти. а выводы сделал неожиданные: "виноват Билл Гейтс"  smile 
PM MAIL   Вверх
taral
Дата 3.7.2008, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Кстати я посмотрел книгу. Я тоже был прав. Да и не тот дурак что спрашивает, а тот что не знает и молчит... Так что вы зря смеялись. Да и я не говорил что виста виновата. Я сказал что видно английская виста виновата. И из за нее используется не подходящая мне локаль. Потому на русской операционке у меня все нормально работало.
Теперь еще вопросы если не против.
Почему на выводимый текст влияло то в какой кодировке я сохранял файл? Как именно изменить локаль на ту чтобы я мог нормально наробать с русским текстом в UTF-8?
setlocale (LC_ALL, 0) выводит LC_COLLATE=C;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
я так понимаю что установка локали происходит так: setlocale (LC_CTYPE, 'russian_Russia.utf-8') или setlocale (LC_CTYPE, 'utf-8') Но я понимаю не правильно) Поскольку не работает. Помогите пожалуйста.

Это сообщение отредактировал(а) taral - 3.7.2008, 04:21
PM MAIL   Вверх
Smak
Дата 3.7.2008, 07:01 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.6.2005

Репутация: 1
Всего: 1



Причём тут setlocale вообще не понял, так как функции json_encode и json_decode работают только с кодировкой UTF-8.
Т.е. перед использованием этих функций надо конвертировать данные в UTF, что можно сделать с помощью функции iconv.

Пример:
Код


// Если нужно просто вывести строку, то можно сделать так:
$text = 'Этот текст будет конвертирован в utf';
$text = iconv('cp1251', 'utf-8', $text);
echo json_encode($text);

// Но удобнее использовать одну функцию для конвертации как строк так и массивов, например:

$arr = array('Этот текст', 'будет конвертирован', 'в utf');
echo json_encode(convert('cp1251', 'utf-8', $arr));

function convert($from, $to, $var)
{
    if (is_array($var))
    {
        $new = array();
        foreach ($var as $key => $val)
        {
            $new[convert($from, $to, $key)] = convert($from, $to, $val);
        }
        $var = $new;
    }
    else if (is_string($var))
    {
        $var = iconv($from, $to, $var);
    }

    return $var;
}



Я так понимаю использование функции json_encode тебе нужно для ajax'a, следовательно выходные данные как раз будут в UTF-8, что корректно примет frontend. Кстати, если ты посылаешь данные от frontend'a к backend'у с помощью ajax'a то входящие данные тоже приходят в UTF-8. Следовательно тебе надо будет отконвертировать данные из UTF-8 в CP1251.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 3.7.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Smak @  3.7.2008,  06:01 Найти цитируемый пост)
 так как функции json_encode и json_decode работают только с кодировкой UTF-8

черт. я пропустил упоминание json_*. прошу прощения, что разве тут... smile
Цитата(taral @  3.7.2008,  03:19 Найти цитируемый пост)
 Так что вы зря смеялись.

не обижайся. я не над тобой смеялся. а над тем, что я увидел в твоем вопросе(претензии к Висте). сам придумал - сам смеюсь smile

PM MAIL   Вверх
taral
Дата 4.7.2008, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

Я так понимаю использование функции json_encode тебе нужно для ajax'a, следовательно выходные данные как раз будут в UTF-8, что корректно примет frontend. Кстати, если ты посылаешь данные от frontend'a к backend'у с помощью ajax'a то входящие данные тоже приходят в UTF-8. Следовательно тебе надо будет отконвертировать данные из UTF-8 в CP1251.

Вот она настоящая причина! Спасибо огромное. Теперь все стало ясно!
Цитата

не обижайся. я не над тобой смеялся. а над тем, что я увидел в твоем вопросе(претензии к Висте). сам придумал - сам смеюсь smile

ОК по рукам)
PM MAIL   Вверх
vglaz
Дата 27.8.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.8.2008

Репутация: нет
Всего: нет



у меня ника кне хочет этот json_encode работать:(

код следущий:
<?
    $obj = array('1' => 'test23', '2' => 'тест23');
    echo json_encode($obj);
?>
получаю в ответ такое:

{"1":"test23","2":"\u0442\u0435\u0441\u044223"}

конвертор описанный тут не помогает. где грабли?
PM MAIL   Вверх
Sannis
Дата 27.8.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



Цитата(vglaz @  27.8.2008,  23:43 Найти цитируемый пост)
получаю в ответ такое:

{"1":"test23","2":"\u0442\u0435\u0441\u044223"}

Так это же правильный ответ, в чём проблема? smile


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Rakoth
Дата 3.10.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Цитата(Sannis @  27.8.2008,  23:53 Найти цитируемый пост)
Так это же правильный ответ, в чём проблема?


Извините, что поднимаю старую тему, и вообще вмешиваюсь в обсуждение, но по-моему тут есть очень даже большая проблема!!
Как мы видим, "т" превращается в "\u0442" и это 6 символов вместо одного! Ну очень бы хотелось не умножать на 6 количество передаваемых данных, а то сам смысл теряется..(( может есть какое-нибудь простое решение (перевести всё приложение и базу в utf-8 практически невозможно)??
PM MAIL   Вверх
BerdArt
Дата 9.1.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



vglaz
Rakoth
Все работает!!! Проверено на собственной шкуре! smile 
Код

$obj = array('1' => 'test23', '2' => 'тест23');
    echo json_encode($obj);
 echo json_encode(convert('cp1251', 'utf-8', $obj));
    
    
function convert($from, $to, $var)
{
    if (is_array($var))
    {
        $new = array();
        foreach ($var as $key => $val)
        {
            $new[convert($from, $to, $key)] = convert($from, $to, $val);
        }
        $var = $new;
    }
    else if (is_string($var))
    {
        $var = iconv($from, $to, $var);
    }
    return $var;
}

PM ICQ   Вверх
Bkmz
Дата 1.10.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



При выборке данных с помошью скрипта php

Код

<?php

$db = mysql_connect ("localhost", "user", "231223");
mysql_select_db ("ExtJS", $db);

$start = ($_REQUEST['start'] != '') ? $_REQUEST['start'] : 0;
$limit = ($_REQUEST['limit'] != '') ? $_REQUEST['limit'] : 3;
$count_sql = "SELECT * FROM paging_grid";
$sql = $count_sql . " LIMIT ".$start.", ".$limit;
$arr = array();
If (!$rs = mysql_query($sql)) {
echo '{success:false}';
}else{
$rs_count = mysql_query($count_sql);
$results = mysql_num_rows($rs_count);
while($obj = mysql_fetch_object($rs)){
$arr[] = $obj;
}
echo '{success:true,results:'.$results.',
rows:'.json_encode($arr).'}';
}
?>


В браузере получаю такой результат :

{success:true, results:4, rows:[{"id":"1","title":"","director":"qqq"},{"id":"2","title":"www","director":"www"},{"id":"3","title":"eee","director":"eee"}]}

Вот тут  [{"id":"1","title":"","director":"qqq"}, должен быть -- > "title":"русский текст", а не пустые " ".

Что делать?

Приведенный вышо скрип конвертации кодировки мне не помог.
PM MAIL ICQ Skype   Вверх
capitan
Дата 1.10.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Я в своих проектах использую function array2json($arr)

http://kurapov.name/article/857/
и никаких проблем. Понимает русскую кодировку. Там чуток поправить нужно только.

Проверено - работает
Код

// Json в windows
    function array2json($arr) {
        $parts = array();
        $is_list = false;
        
        if (!is_array($arr)) return;
        if (count($arr)<1) return '{}';
        
        //Find out if the given array is a numerical array
        $keys = array_keys($arr);
        $max_length = count($arr); 
                
        if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {//See if the first key is 0 and last key is length - 1
            $is_list = true;
            for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
                if($i != $keys[$i]) { //A key fails at position check.
                    $is_list = false; //It is an associative array.
                    break;
                }
            }
        }

        foreach($arr as $key=>$value) {
            if(is_array($value)) { //Custom handling for arrays
                if($is_list) $parts[] = array2json($value); /* :RECURSION: */
                else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
            } else {
                $str = '';
                if(!$is_list) $str = '"' . $key . '":';

                //Custom handling for multiple data types
                if(is_numeric($value)) $str .= $value; //Numbers
                elseif($value === false) $str .= 'false'; //The booleans
                elseif($value === true) $str .= 'true';
                else $str .= '"' . addslashes($value) . '"'; //All other things
                // :TODO: Is there any more datatype we should be in the lookout for? (Object?)

                $parts[] = $str;
            }
        }
        $json = implode(',',$parts);

        if($is_list) return '[' . $json . ']';//Return numerical JSON
        return '{' . $json . '}';//Return associative JSON
    }


Это сообщение отредактировал(а) capitan - 1.10.2009, 22:43
PM MAIL WWW ICQ   Вверх
HnH
Дата 2.10.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 23.2.2006
Где: Питер

Репутация: 1
Всего: 1



Ещё один вариант:
Код

function php2js($a=false)
{
  if (is_null($a)) return 'null';
  if ($a === false) return 'false';
  if ($a === true) return 'true';
  if (is_scalar($a))
  {
    if (is_float($a))
    {
      $a = str_replace(",", ".", strval($a));
    }

    static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'),
    array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
    return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
  }
  $isList = true;
  for ($i = 0, reset($a); $i < count($a); $i++, next($a))
  {
    if (key($a) !== $i)
    {
      $isList = false;
      break;
    }
  }
  $result = array();
  if ($isList)
  {
    foreach ($a as $v) $result[] = php2js($v);
    return '[ ' . join(', ', $result) . ' ]';
  }
  else
  {
    foreach ($a as $k => $v) $result[] = php2js($k).': '.php2js($v);
    return '{ ' . join(', ', $result) . ' }';
  }
}

PM MAIL WWW ICQ   Вверх
nerezus
Дата 2.10.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Сколько геморроя только из-за того, что боитесь юзать utf-8 и json-функции?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Bkmz
Дата 5.10.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



Лучше всего по возможностям и по простоте кода для решения данной проблемы подходит.

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;
}

function json_safe_encode($var)
{
   return json_encode(json_fix_cyr($var));
}
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1188 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.