this issue seems specific to microsofttranslator.com so please ... any answers, if you can test against it ...
这个问题似乎特定于microsofttranslator.com所以请...任何答案,如果你可以测试它...
Using the following URL for translation: http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray .. I send via cURL some fantastic arguments, and get back the following result:
使用以下URL进行翻译:http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray ..我通过cURL发送了一些很棒的参数,并得到以下结果:
[
{
"From":"en",
"OriginalTextSentenceLengths":[13],
"TranslatedText":"我是最好的",
"TranslatedTextSentenceLengths":[5]
},
{
"From":"en",
"OriginalTextSentenceLengths":[16],
"TranslatedText":"你是最好的",
"TranslatedTextSentenceLengths":[5]
}
]
When I use json_decode($output, true);
on the output from cURL, json_decode gives an error about the syntax not being appropriate in the returned JSON:
当我使用json_decode($ output,true);在来自cURL的输出中,json_decode在返回的JSON中提供了关于语法不合适的错误:
json_last_error() == JSON_ERROR_SYNTAX
The headers being returned with the JSON:
使用JSON返回的标头:
Response Headers
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
Raw content:
[{"From":"en","OriginalTextSentenceLengths":[13],"TranslatedText":"我是最好的","TranslatedTextSentenceLengths":[5]},{"From":"en","OriginalTextSentenceLengths":[16],"TranslatedText":"你是最好的","TranslatedTextSentenceLengths":[5]}]
cURL code:
$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);
2 个解决方案
#1
6
The API is returning a wrong byte order mark (BOM).
The string data itself is UTF-8 but is prepended with U+FEFF
which is a UTF-16 BOM. Just strip out the first two bytes and json_decode
.
API返回错误的字节顺序标记(BOM)。字符串数据本身是UTF-8,但前面加上U + FEFF,这是一个UTF-16 BOM。只需删除前两个字节和json_decode。
...
$output = curl_exec($ch);
// Insert some sanity checks here... then,
$output = substr($output, 3);
...
$decoded = json_decode($output, true);
Here's the entirety of my test code.
这是我的全部测试代码。
$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));
Which gives me
这给了我
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
)
)
)
BOM上的*条目
#2
1
There is nothing syntactically wrong with your JSON string. It is possible that the json is coming back with characters outside the UTF-8 byte range, but this would cause json_decode() to throw an exception indicating that.
您的JSON字符串没有语法错误。 json可能会返回UTF-8字节范围之外的字符,但这会导致json_decode()抛出异常,表明这一点。
Test Code:
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);
}
?>
Output:
$ 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
)
)
)
#1
6
The API is returning a wrong byte order mark (BOM).
The string data itself is UTF-8 but is prepended with U+FEFF
which is a UTF-16 BOM. Just strip out the first two bytes and json_decode
.
API返回错误的字节顺序标记(BOM)。字符串数据本身是UTF-8,但前面加上U + FEFF,这是一个UTF-16 BOM。只需删除前两个字节和json_decode。
...
$output = curl_exec($ch);
// Insert some sanity checks here... then,
$output = substr($output, 3);
...
$decoded = json_decode($output, true);
Here's the entirety of my test code.
这是我的全部测试代码。
$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));
Which gives me
这给了我
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
)
)
)
BOM上的*条目
#2
1
There is nothing syntactically wrong with your JSON string. It is possible that the json is coming back with characters outside the UTF-8 byte range, but this would cause json_decode() to throw an exception indicating that.
您的JSON字符串没有语法错误。 json可能会返回UTF-8字节范围之外的字符,但这会导致json_decode()抛出异常,表明这一点。
Test Code:
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);
}
?>
Output:
$ 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
)
)
)