За последние 24 часа нас посетили 20220 программистов и 1009 роботов. Сейчас ищут 366 программистов ...

экранирование символов и utf8

Тема в разделе "PHP для новичков", создана пользователем Isaev, 17 дек 2013.

  1. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    Доброго времени суток

    получаю ответ от сервера в формате json, проблема в том, как избавиться от экранирования спецсимволов и вернуть первоначальный вид юникода?
    получаю например такую строку:
    <a href=\"http:\/\/www.facebook.com\/help\/\" target=\"_blank\">Like Button bet\u00e4tigen<\/a>
    stripslashes и utf8_decode почему-то не помогают
    get_magic_quotes_gpc() тоже говорит, что php сам ничего не менял, как я понимаю
    нужно получить в таком виде:
    <a href="http://www.facebook.com/help/" target="_blank">Like Button betätigen</a>
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (PHP):
    1. $str = '<a href=\"http:\/\/www.facebook.com\/help\/\" target=\"_blank\">Like Button bet\u00e4tigen<\/a>';
    2. $str = stripslashes($str);
    выводит
    Код (Text):
    1. [url="http://www.facebook.com/help/"]Like Button betu00e4tigen[/url]
    Работает. Не? Только там в тексте слешик тоже убрало, так что нужно сначала с юникодом разобраться.

    А если строку, которая должна быть в итоге, закодировать в utf8
    Код (PHP):
    1. $str2 = '[url="http://www.facebook.com/help/"]Like Button betätigen[/url]';
    2. $str2 = utf8_encode($str2);
    , то получится
    Код (Text):
    1. [url="http://www.facebook.com/help/"]Like Button betätigen[/url]
    явно отличается от приходящей в JSON. Так что utf8_decode не подойдёт по-любому. Тут нужна функция по расшифровке escape последовательностей.

    Добавлено спустя 8 минут 28 секунд:
    Например
    Код (PHP):
    1. <?php
    2. $str = '<a href=\"http:\/\/www.facebook.com\/help\/\" target=\"_blank\">Like Button bet\u00e4tigen<\/a>';
    3. function replace_unicode_escape_sequence($match) {
    4.     return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
    5. }
    6. $str = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', $str);
    7. $str = stripslashes($str); 
    и вот оно
    Код (Text):
    1. [url="http://www.facebook.com/help/"]Like Button betätigen[/url]
     
  3. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Если он получает json, могу предположить, что обработка идет в js, а значит unescape() будет более чем достаточно.
     
  4. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    хм... значит ноги ростут не отттуда
    начнём с начала тогда
    сам json я же и формирую, получая данные из удалённой базы данных, с целью последующего парсинга из явы в приложении для андроида
    формируется это примерно так:
    Код (Text):
    1.  
    2.       if($resLev1=$db->query($queryLev1)) {
    3.         // Menu Level 1
    4.         while($rowLev1=$resLev1->fetch_assoc()) {
    5.           $mid2=$rowLev1['id'];
    6.           $pid=$rowLev1['pid'];
    7.           $title=$rowLev1['title'];
    8.           $header=$rowLev1['headline'];
    9.           $content=$rowLev1['text'];
    10.           array_push($datenLev1,array($mid2,$pid,$title,$header,$content));
    11.           ...
    12.           $resultArr["level1"]=$datenLev1;
    13.           echo json_encode($resultArr);
    14. }}
    получается, что этот json_encode и творит всё ненужное...
    может как-то возможно сформировать json другим способом? чтобы не вставлялось экранирование и не заменялись юникод на \uXXXX?

    а вот за это отдельное спасибо, часто нужно)
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    ну да, а потом в json_decode может сотворить нужное:
    Код (PHP):
    1. <?php
    2. $resultArr = array('word'=>'Like Button betätigen');
    3. $encoded = json_encode($resultArr);
    4. echo $encoded,"\n\n";
    5. print_r(json_decode($encoded));
    выводит
    Код (Text):
    1. {"word":"Like Button bet\u00e4tigen"}
    2.  
    3. stdClass Object
    4. (
    5.     [word] => Like Button betätigen
    6. )
     
  6. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    это то ясно
    только вот проблеммка... json будет получаться из java кода, а не из пхп
    потому обратное преобразование не столь приятно... Хотелось бы, чтобы оно формировалось уже без "мусора", чтобы там не химичить
    и не в виде "stdClass Object", а в виде валидного json иначе парсер начинает ругаться, что json не валидный и не хочет его разберать(
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    далее код на PHP и даже вывод
    внезапно
    а это совсем другая тема. этот объект создаётся по умолчанию функцией json_decode
     
  8. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    ну не то, чтобы внезапно) дочитывать надо
    это я понимаю, хотел сказать, что поэтому и не поможет
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Врача! :)
    Ладно, запутывай дальше, я пас.
    И считаю, что по первому сообщению нашёл решение (учитывая тематику и текущую ветку форума).
     
  10. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
  11. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    да, благодарю
    дальше разберусь сам уже :)

    да, т.к. js то тут при чем?
     
  12. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Дык ить, "тред не читай@сразу отвечай", всмысле, на момент ответа, была уверенность, что речь таки об более профильных вещах сему форуму :)
    Ибо в первом посте нету конкретики, есть сообщение о том, что получаешь json, ну и выводы далее в голове сами рождаются )
     
  13. Isaev

    Isaev Активный пользователь

    С нами с:
    17 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    Ke1eth, ну так я и не критиковал) дали несколько вариантов решения и пошел по тому, который более соответствует моей проблемме. На момент вашего повторного вопроса конкретика уже была внесена и ответ был очевиден
    вроде на форумах таким образом обычно и происходит общение...
    ну если вдруг в этом понимании у нас разные взгляды, извиняюсь
     
  14. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    да не, все нормально, сам балбес =)