ユーザーのIPに基づいて、ローカル天気予報を取得しようとしています。PHPのsimplexml_load_file(URLに特殊文字がある場合)
私はgeoplugin.netを使用してユーザーの場所を取得し、都市と国名をGoogle天気APIに供給しています。
//Get user IP
$ip = $_SERVER['REMOTE_ADDR'];
$geolocation = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip));
$geo_city = $geolocation['geoplugin_city'];
$geo_country = $geolocation['geoplugin_countryName'];
$file = "http://www.google.com/ig/api?weather=".$geo_city.",".$geo_country;
$xml = simplexml_load_file($file);
//Echo content of retrieved XML for debugging purposes
echo "<pre>";
print_r($xml);
echo "</pre>";
それはほとんどの場合に適していますが、私は私自身のIP上でそれをしようとすると、私は(100%正確ますが、十分に近接していない)Søborg、デンマークを取得し、それは私からほとんど空の応答を提供します天気API。
この場合の主な容疑者は、ひどい "ø"文字です。
私が欲しいXMLをここで見ることができます:私は取得していますhttp://www.google.com/ig/api?weather=S%C3%B8borg,Denmark
XMLはここで見ることができます:http://www.google.com/ig/api?weather=S
私はブラウザにこのURLを入力すると、それが正常に動作します:
http://www.google.com/ig/api?weather=Søborg,Denmark
私はこのバージョンを使用する場合、それは(ブラウザで)と同様に動作します
http://www.google.com/ig/api?weather=S%C3%B8borg,Denmark
上記リターンの
http://www.google.com/ig/api?weather=S%26oslash%3Bborg,Denmark
なしsimplexml_load_fileに供給され、所望の結果、():
しかし、このバージョンはボルグ、Syddanmarkの予測を返します。
前述したように、私は文字セットの問題であると考えていますが、どうしたらいいのか分かりません。
これを解決する正しい方法は何ですか?
代わりにGoogle天気APIのパラメータとして緯度と経度を使用できることは知っていますが、それは問題を回避しているだけで解決できません。
優秀! 「C3」を「%C3%B8」に変換するには、正しい方法を教えてください。組み込み関数はありますか? – Lowkey
'%s%C3%B8borg'を返す – sanmai
実際にはそうですが、geoplugin.net xmlから取得した文字列は(mb_detect_encoding()によると)ASCIIであるようですしたがって、私が 'rawurlencode()'を実行したときに、 'S%26oslash%3Bborg'が返されます。 私は[ASCIIをUTF-8に変換する方法](http://stackoverflow.com/questions/4983989/convert-ascii-to-utf-8-encoding)を検索し、ASCIIが実際にはUTF-8のサブセット私は '$ string = iconv( 'ASCII'、 'UTF-8 // IGNORE'、$ geo_city)を試しました。 \t echo mb_detect_encoding($ string); 'はリンクに示唆されていますが、それでもASCIIを返します。 – Lowkey