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

Непонятные символы JSON

Тема в разделе "PHP для новичков", создана пользователем Sasha55555, 14 мар 2019.

  1. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    Использую echo json_encode($buf, JSON_UNESCAPED_UNICODE) и получаю "\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u0000". Что делать?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    ну похоже что константа JSON_UNESCAPED_UNICODE не определена
    а вам вообще принципиально?
     
  3. Babka_Gadalka

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

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    Проверь скрипт в какой кодировке
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    А у тебя видимо более старая версия. Пересядь на нормальный PHP
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Хотел шуткануть, ну да ладно.
    на js используй :
    Код (Javascript):
    1. let myObject = JSON.parse('<?php echo json_encode($your_array); ?>');
    2. console.log(myObject);
    --- Добавлено ---
    А вообще это нормально, что он так выводит.
    Если тебе надо работать с json на php, то на вот попробуй прогони код из документации. Да посмотри что каждый из флагов json encode делает:
    PHP:
    1. $a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9");
    2.  
    3. echo "Normal: ",  json_encode($a), "\n";
    4. echo "Tags: ",    json_encode($a, JSON_HEX_TAG), "\n";
    5. echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "\n";
    6. echo "Quot: ",    json_encode($a, JSON_HEX_QUOT), "\n";
    7. echo "Amp: ",     json_encode($a, JSON_HEX_AMP), "\n";
    8. echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n";
    9. echo "All: ",     json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n";
    10.  
    11. $b = array();
    12.  
    13. echo "Empty array output as array: ", json_encode($b), "\n";
    14. echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n";
    15.  
    16. $c = array(array(1,2,3));
    17.  
    18. echo "Non-associative array output as array: ", json_encode($c), "\n";
    19. echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "\n\n";
    20.  
    21. $d = array('foo' => 'bar', 'baz' => 'long');
    22.  
    23. echo "Associative array always output as object: ", json_encode($d), "\n";
    24. echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "\n\n";
    --- Добавлено ---
    @Sasha55555 кстати скажу сразу одну вещь, достаточно очевидную. Будь внимателен с двойными и одинарными ковычками (пометка про одинарные - это на тот момент, если ты вывод из json_encode будешь напрямую вставлять в JSON.parse) при работе с json потому что каждый ключ значение в этом формате находится в двойных ковыках. И если вдруг в значение будут содержаться ковычки... То будут проблемы с парсингом на стороне js когда вставишь в JSON.parse(), поэтому входящие ковычки двойные, да и одинарные тоже рекомендую экранировать ещё до момента их складывания в бд. Ну а коли если так не делал, то экранируй их перед json_encode и тогда проблем не будет.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    PHP:
    1. echo json_encode('"');
    выведет
    Код (Text):
    1.  
    2. "\""
    Так что здесь всё ОК
     
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    есть мнение что отправлять нужно без указания кодировки чтобы избежать потерь и обрабатывать на приёме уже
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    :)
    @mkramer А вот так попробуй и в консоль посмотри
    PHP:
    1. $arForJson = ["address" => 'улица Тухачёвского дом "2", кв. "25"'];
    Код (Javascript):
    1. var jsonStr = '<?php echo json_encode($arForJson); ?>'
    2.     console.log(jsonStr)
    3.     object = JSON.parse(jsonStr)
    4.     console.log(object)
    --- Добавлено ---
    Но при этом сделай вот так и тоже посмотри в консоль
    PHP:
    1. $arForJson = ["address" => 'улица Тухачёвского дом \"2\", кв. \"25\"'];
    Код (Javascript):
    1. <script>
    2.     var jsonStr = '<?php echo json_encode($arForJson); ?>'
    3.     console.log(jsonStr)
    4.     object = JSON.parse(jsonStr)
    5.     console.log(object)
    6. </script>
    --- Добавлено ---
    Дело в том что экранировние для js нужно в \\ в двойном варианте в одинарном не работает)
    --- Добавлено ---
    а вот одинарные кавыки он вообще не экранирует)
    PHP:
    1. $arForJson = ["address" => "улица Тухачёвского дом '2', кв. '25'"];
    2. var_dump( json_encode($arForJson));
    --- Добавлено ---
    но тут можно сделать ещё так:
    PHP:
    1. $arForJson[] = ["address" => 'улица Тухачёвского дом "2", кв. "25"'];
    2. $arForJson[] = ["address" => 'улица Тухачёвского дом "2", кв. "25"'];
    3. $arForJson[] = ["address" => 'улица Тухачёвского дом "2", кв. "25"'];
    4. $arForJson[] = ["address" => 'улица Тухачёвского дом "2", кв. "25"'];
    Код (Javascript):
    1. var jsonStr = JSON.stringify(<?php echo json_encode($arForJson); ?>)
    2.     console.log(jsonStr)
    3.     object = JSON.parse(jsonStr)
    4.     console.log(object)
    --- Добавлено ---
    Поэтому и сказал будьте внимательны с кавычками :)
    Но тут как бы вообще со всеми знаками которыен необходимо экранировать при работе с json строкой.
    Они собственно перечислены в документации все.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @askanim, ты прав. Но тогда лучше не экранировать заранее (тем более перед добавлением в базу, кроме необходимого), а использовать флаг JSON_HEX_QUOT