我正在使用deepl.com提供的API,该API提供自动翻译。我通过cURL调用了API,并返回了一个json字符串,看起来不错,但由于某种原因无法被PHP解码。
首先让我展示如何进行cURL调用:-
$content = "bonjour <caption>monsieur</caption> madame";
$url = 'https://api.deepl.com/v2/translate';
$fields = array(
'text' => $content,
'target_lang' => $lg,
'tag_handling' => 'xml',
'ignore_tags' => 'caption',
'auth_key' => 'my_api_key');
$fields_string = "";
foreach($fields as $key=>$value)
{
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded','Content-Length: '. strlen($fields_string)));
$result = curl_exec($ch);
curl_close($ch);
如果在这个阶段我愿意
echo $result;
我得到:
{"translations":[{"detected_source_language":"FR","text":"Hola <caption>monsieur</caption> Señora"}]}
对我来说似乎还可以。然后,如果我使用下面的代码-
echo gettype($result);
我仍然可以找到“字符串”,但是现在,以下代码失败了:
$result = json_decode($result,true);
print_r($result);
输出为空!
如果我现在做这样的事情:
$test = '{"translations":[{"detected_source_language":"FR","text":"Hola <caption>monsieur</caption> Señora"}]}';
echo gettype($test);
$test = json_decode($test,true);
print_r($test);
我得到了一个很好的数组:
(
[translations] => Array
(
[0] => Array
(
[detected_source_language] => FR
[text] => Hola <caption>monsieur</caption> Señora
)
)
)
除了将内容从API复制/粘贴到静态变量外,我什么也没做,虽然可以,但是来自API,事实并非如此。就像PHP无法理解来自API的数据一样。
您有什么问题的想法吗?
谢谢!
洛朗
答案 0 :(得分:2)
我之前遇到过非常相似的问题,对我来说,问题在于从API返回的数据的编码是unicode。我猜想当您复制/粘贴字符串时,您的硬编码最终会变成不同的编码,因此当传递给json_decode时它可以正常工作。
PHP文档指定json_decode仅适用于UTF-8编码的字符串: http://php.net/manual/en/function.json-decode.php
您也许可以使用mb_convert_encoding()转换为UTF-8: http://php.net/manual/en/function.mb-convert-encoding.php
在调用json_decode之前尝试以下操作:
$result = mb_convert_encoding($result, "UTF-8");
答案 1 :(得分:1)
就像@Eilert Hjelmeseth所说的那样,您在JSON字符串中有一些特殊的字符=>“Señora”
将字符串编码为UTF8的另一种方法:utf8_encode():
$result = json_decode(utf8_encode($result),true);
答案 2 :(得分:1)
确保将CURLOPT_RETURNTRANSFER
设置为true。只有这样curl_exec
才会真正返回响应,否则它将输出响应并返回一个布尔值,指示成功或失败。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
if ($result !== false) {
$response = json_decode($result, true);
// do something with $response
} else {
// handle curl error
}