![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
бугога.
на форуме десятки тем про проблемы кодировок. в мане по означенным функциям тонны коментариев и полдесятка ссылок на описания. и все равно ты считаешь, что проблема в Висте. мило. значит так. кодировка, используемая для функций str*(strtoupper, strstr и т.д.) задается при помощи setlocale если уверен, что строки будут в unicode(utf-8, utf-16 и т.д.), то вместо функций str* используй аналоги функций из серии mb_* чтоб регулярки работали с юникодом, надо указать модификатор u Добавлено через 40 секунд ты уж прости мою веселость. просто ты наступил на все грабли, которые смог найти. а выводы сделал неожиданные: "виноват Билл Гейтс" ![]() |
|||
|
||||
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
Smak |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 30.6.2005 Репутация: 1 Всего: 1 |
Причём тут setlocale вообще не понял, так как функции json_encode и json_decode работают только с кодировкой UTF-8.
Т.е. перед использованием этих функций надо конвертировать данные в UTF, что можно сделать с помощью функции iconv. Пример:
Я так понимаю использование функции json_encode тебе нужно для ajax'a, следовательно выходные данные как раз будут в UTF-8, что корректно примет frontend. Кстати, если ты посылаешь данные от frontend'a к backend'у с помощью ajax'a то входящие данные тоже приходят в UTF-8. Следовательно тебе надо будет отконвертировать данные из UTF-8 в CP1251. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
черт. я пропустил упоминание json_*. прошу прощения, что разве тут... ![]() не обижайся. я не над тобой смеялся. а над тем, что я увидел в твоем вопросе(претензии к Висте). сам придумал - сам смеюсь ![]() |
|||
|
||||
taral |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Вот она настоящая причина! Спасибо огромное. Теперь все стало ясно!
ОК по рукам) |
||||
|
|||||
vglaz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.8.2008 Репутация: нет Всего: нет |
у меня ника кне хочет этот json_encode работать:(
код следущий: <? $obj = array('1' => 'test23', '2' => 'тест23'); echo json_encode($obj); ?> получаю в ответ такое: {"1":"test23","2":"\u0442\u0435\u0441\u044223"} конвертор описанный тут не помогает. где грабли? |
|||
|
||||
Sannis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.8.2007 Где: Москва Репутация: 6 Всего: 13 |
Так это же правильный ответ, в чём проблема? ![]() -------------------- |
|||
|
||||
Rakoth |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2008 Репутация: нет Всего: нет |
Извините, что поднимаю старую тему, и вообще вмешиваюсь в обсуждение, но по-моему тут есть очень даже большая проблема!! Как мы видим, "т" превращается в "\u0442" и это 6 символов вместо одного! Ну очень бы хотелось не умножать на 6 количество передаваемых данных, а то сам смысл теряется..(( может есть какое-нибудь простое решение (перевести всё приложение и базу в utf-8 практически невозможно)?? |
|||
|
||||
BerdArt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
vglaz,
Rakoth, Все работает!!! Проверено на собственной шкуре! ![]()
|
|||
|
||||
Bkmz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.2.2008 Репутация: нет Всего: нет |
При выборке данных с помошью скрипта php
В браузере получаю такой результат : {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":"русский текст", а не пустые " ". Что делать? Приведенный вышо скрип конвертации кодировки мне не помог. |
|||
|
||||
capitan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 27.2.2005 Где: Москва Репутация: 9 Всего: 13 |
Я в своих проектах использую function array2json($arr)
http://kurapov.name/article/857/ и никаких проблем. Понимает русскую кодировку. Там чуток поправить нужно только. Проверено - работает
Это сообщение отредактировал(а) capitan - 1.10.2009, 22:43 |
|||
|
||||
HnH |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 23.2.2006 Где: Питер Репутация: 1 Всего: 1 |
Ещё один вариант:
|
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
Сколько геморроя только из-за того, что боитесь юзать utf-8 и json-функции?
|
|||
|
||||
Bkmz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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)); } |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |