Æøå в возвращенном результате JSON - данные не выглядят так, как должны

Я получил некоторые данные из запроса URL-адреса, используя JSON со следующим кодом:

$url = 'https://recruit.zoho.com/ats/private/xml/JobOpenings/getRecords?authtoken=$at&scope=recruitapi';
$request = new WP_Http;
$result = $request->request($url, $data = array());
$input = json_encode($result, true);
var_dump($input);

Этот код работал абсолютно нормально, за исключением того, что выходящие данные выглядели очень странно, например:

"content-encoding":"gzip","vary":"Accept-Encoding","strict-transport-security":"max-age=15768000"},"body":"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003E\n\u003Cresponse uri=\"\/ats\/private\/xml\/JobOpenings\/getRecords\"\u003E\u003Cresult\u003E\u003CJobOpenings\u003E\u003Crow no=\"1\"\u003E\u003CFL val=\"JOBOPENINGID\"\u003E\u003C![CDATA[213748000001263043]]\u003E\u003C\/FL\u003E\u003CFL val=\"Published in website\"\u003E\u003C![CDATA[false]]\u003E\u003C\/FL\u003E\u003CFL val=\"Modified by\"\u003E\u003C![CDATA

После некоторых исследований я понял, что часть проблемы, скорее всего, заключается в том, что в данных, которые я запрашиваю, есть æ, ø и å. Другие решили проблему следующим образом:

$input = json_encode(utf8_decode($result), true);

Однако это дает мне эту ошибку:

Warning: utf8_decode() expects parameter 1 to be string, array given in

Я знаю, что массив не является строкой, но как еще мне с этим справиться? Кажется, это сработало для других, и я не могу понять, почему.

Спасибо.

Редактировать:

Я заметил это в начале печатных данных.

string(31486) "{"headers":{"server":"ZGS","date":"Wed, 12 Aug 2015 13:59:32 GMT","content-type":"text\/xml;charset=utf-8"

Означает ли это, что это уже UTF-8, и я полностью отключился?


person Rasmus    schedule 12.08.2015    source источник
comment
запутался... откуда именно этот response uri = ...? Это необработанный текст, возвращаемый этим URL-адресом? или что вы получите после запуска через json_decode?   -  person Marc B    schedule 12.08.2015
comment
Это фрагмент текста, вызванного var_dump($input). Прошу прощения за путаницу, я новичок в PHP и JSON.   -  person Rasmus    schedule 12.08.2015
comment
это невозможно. response uri =... недействителен json. json_encode() никак не может создать такую ​​строку. "response uri =...", С "-кавычками, возможно, будет действительным json.   -  person Marc B    schedule 12.08.2015
comment
Возможно, может помочь еще какой-то контекст: `Accept-Encoding,strict-transport-security:max-age=15768000},body:\n  -  person Rasmus    schedule 12.08.2015
comment
Я также обновил фрагмент в посте, надеюсь, он немного прояснит ситуацию.   -  person Rasmus    schedule 12.08.2015
comment
u003c и u003e — это < и >, поэтому у вас есть экранированный XML в строке.   -  person Marc B    schedule 12.08.2015


Ответы (1)


То, что вы получаете в $result, представляет собой строку utf-8, которая, кажется, представляет собой какой-то URL-адрес. В любом случае, json_encode будет экранировать любой символ Юникода в \u008E строк.

Если вы не хотите экранировать символ utf-8, этот вопрос актуален для вас: Почему функция PHP json_encode преобразует строки UTF-8 в шестнадцатеричные объекты?

Судя по тому, что я вижу, все работает нормально. Хотя строка, которую вы нам предоставили, кажется укороченной, но я предполагаю, что это ошибка с вашей стороны.

person Nico    schedule 12.08.2015
comment
Эй, кажется, это немного изменило ситуацию, но по-прежнему не видно æ ø å "Modified time\\\"\\u003E\\u003C![CDATA[20 Jul-2015]]\\u003E\\u003C\\\/FL\\u003E\\u003CFL val=\\\"Job nr.\\\"\\u003E\\u003C![CDATA[93]]\\u003E\\u003C\\\/FL\\u003E\\u003CFL val=\\\"Stilling\\\"\\u003E\\u003C![CDATA[Senior Sales Manager]]\\u003E\\u003C\\\/FL\\u003E\\u003CFL val=\\\"Kunde\\\"\\u003E\\u003C![CDATA[Top Search Group]]\\u003E\\u003C\\\/FL\\u003E\\u003CFL val=\\\"Kundeansvarlig\\\"\\u003E\\u003C! - person Rasmus; 12.08.2015
comment
Я сделал следующее: $input = json_encode($result, true); $input_unicode = json_encode($input, JSON_UNESCAPED_UNICODE); var_dump($input_unicode); - person Rasmus; 12.08.2015
comment
Почему ты json_encode дважды? Вам нужно сделать это только один раз. Если вы сделаете это дважды, все будет некрасиво. просто сделайте $input = json_encode($result, JSON_UNESCPAED_UNICODE); Внимательно прочитайте документацию: se2.php.net/json_encode - person Nico; 12.08.2015
comment
Спасибо! Продвинул меня еще дальше, но теперь тело выглядит так, я не понимаю: "\n<\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/row><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/FL><\/row> - person Rasmus; 12.08.2015