PHP-json_decode-发出解码字符串

时间:2018-11-24 18:21:34

标签: php json

我正在使用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的数据一样。

您有什么问题的想法吗?

谢谢!

洛朗

3 个答案:

答案 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
}