1

我正在尝试向谷歌货币转换器 URL 发出 curl 请求。这部分有效,我取回了 JSON 数据,但是数据似乎采用了错误的编码。如果我尝试以任何方式转换编码或调整值,它将不起作用,并且我的 json_decode 返回 NULL。

我需要指定编码还是与没有引号的键有关?

下面是一些从他们那里得到结果的代码:

    $url = "https://www.google.com/ig/calculator?hl=en&q=" . $amount . $from . "=?" . $to;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    $return = curl_exec($ch);
    curl_close($ch);

    var_dump($return);

结果通常是围绕这个 {lhs: "9Â 808.90 U.S. dollars",rhs: "7Â 986.40287 Euros",error: "",icc: true}

我将编码转换为 ISO-8859-1 并且它有适当的空格,但它仍然无法正确 json_decode ...

有什么建议么?

4

2 回答 2

0

您的值是“808.90 美元”。只需爆炸()字符串并提取数据。

$data = explode('"', $url);
$data = explode(' ', $data['3']);
$var = $data['0'];
return round($var,3);
于 2012-08-10T23:21:20.830 回答
0

我从来没有得到那些奇怪的字符串。

测试.php

<?php
    $amount = '10$';
    $to = 'EUR';
    $url = "https://www.google.com/ig/calculator?hl=en&q=" . $amount . $from . "=?" . $to;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    $return = curl_exec($ch);
    curl_close($ch);

    // dump the output
    var_dump($return);

    /*
    string(59) "{lhs: "10 US$",rhs: "8.14199642 Euros",error: "",icc: true}"
    */

    // quote the unquoted data from Google
    $forJSON = str_replace(array('lhs', 'rhs', 'error', 'icc'), array('"lhs"', '"rhs"', '"error"', '"icc"'), $return);

    // decode the JSON string and turn it into an array
    $toArray = json_decode($forJSON, true);

    // dump the array
    print_r($toArray);

    /* 
    Array
    (
        [lhs] => 9 808.90 U.S. dollars
        [rhs] => 7 986.40287 Euros
        [error] => 
        [icc] => 1
    )
    */
?>

你应该尝试的事情:

  • 确保将文件保存为 ANSI - 否则会得到奇怪的值
  • 如果上述解决方案不起作用,请尝试重新制作文件,某处必须有编码。
  • 或者你可能从一些实际上并没有使用的程序中复制了 9,808.90,,它是那里的另一个字符
  • 您还应该知道 Google 使用未引用的数据进行响应,这不是 JSON 有效的,尝试像我一样逃跑,您应该能够解码
于 2012-08-10T23:26:38.497 回答