эта проблема кажется специфичной для microsofttranslator.com, поэтому, пожалуйста … любые ответы, если вы можете протестировать ее …
Используя следующий URL для перевода: http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray .. Я отправляю через cURL некоторые фантастические аргументы и возвращаю следующий результат:
[ { "From":"en", "OriginalTextSentenceLengths":[13], "TranslatedText":"我是最好的", "TranslatedTextSentenceLengths":[5] }, { "From":"en", "OriginalTextSentenceLengths":[16], "TranslatedText":"你是最好的", "TranslatedTextSentenceLengths":[5] } ]
Когда я использую json_decode($output, true);
на выходе из cURL, json_decode дает ошибку в отношении того, что синтаксис не подходит для возвращаемого JSON :
json_last_error() == JSON_ERROR_SYNTAX
Заголовки возвращаются с JSON:
Заголовки ответов
Cache-Control:no-cache Content-Length:244 Content-Type:application/x-javascript; charset=utf-8 Date:Sat, 06 Aug 2011 13:35:08 GMT Expires:-1 Pragma:no-cache X-MS-Trans-Info:s=63644
Сырое содержимое:
[{"From":"en","OriginalTextSentenceLengths":[13],"TranslatedText":"我是最好的","TranslatedTextSentenceLengths":[5]},{"From":"en","OriginalTextSentenceLengths":[16],"TranslatedText":"你是最好的","TranslatedTextSentenceLengths":[5]}]
Код cURL:
$texts = array("i am the best" => 0, "you are the best" => 0); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = array( 'appId' => $bing_appId, 'from' => 'en', 'to' => 'zh-CHS', 'texts' => json_encode(array_keys($texts)) ); curl_setopt($ch, CURLOPT_URL, $bingArrayUrl . '?' . http_build_query($data)); $output = curl_exec($ch);
API возвращает неправильный знак порядка байтов (BOM).
Строковые данные сами по себе являются UTF-8, но добавляются с U+FEFF
который представляет собой спецификацию UTF-16. Просто json_decode
первые два байта и json_decode
.
... $output = curl_exec($ch); // Insert some sanity checks here... then, $output = substr($output, 3); ... $decoded = json_decode($output, true);
Вот весь мой тестовый код.
$texts = array("i am the best" => 0, "you are the best" => 0); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = array( 'appId' => $bing_appId, 'from' => 'en', 'to' => 'zh-CHS', 'texts' => json_encode(array_keys($texts)) ); curl_setopt($ch, CURLOPT_URL, $bingArrayUrl . '?' . http_build_query($data)); $output = curl_exec($ch); $output = substr($output, 3); print_r(json_decode($output, true));
Что дает мне
Array ( [0] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 13 ) [TranslatedText] => 我是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) [1] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 16 ) [TranslatedText] => 你是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) )
Запись в Википедии по спецификации
В вашей строке JSON нет ничего синтаксически неправильного. Возможно, что json возвращается с символами вне диапазона байтов UTF-8, но это приведет к тому, что json_decode () будет генерировать исключение, указывающее на это.
Тестовый код:
ini_set("track_errors", 1); $json = ' [ { "From":"en", "OriginalTextSentenceLengths":[13], "TranslatedText":"我是最好的", "TranslatedTextSentenceLengths":[5] }, { "From":"en", "OriginalTextSentenceLengths":[16], "TranslatedText":"你是最好的", "TranslatedTextSentenceLengths":[5] } ] '; $out = @json_decode($json, TRUE); if(!$out) { throw new Exception("$php_errormsg\n"); } else { print_r($out); } ?>
Вывод:
$ php -f jsontest.php Array ( [0] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 13 ) [TranslatedText] => 我是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) [1] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 16 ) [TranslatedText] => 你是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) )