1

Google 通貨コンバータの 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

私はその奇妙な文字列を得ることはありません。

test.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 に答える