2012-01-20 12 views
2

ユーザーの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のパラメータとして緯度と経度を使用できることは知っていますが、それは問題を回避しているだけで解決できません。

答えて

1

私たちの後に私たちにSøborgを与えますそのようにHTMLエンティティをデコード:

$city = 'S%26oslash%3Bborg,Denmark'; 
echo $city = rawurldecode($city); 
//prints S&oslash;borg,Denmark 

echo $city = html_entity_decode($city, 0, 'UTF-8'); 
//prints Søborg,Denmark 

echo $city = rawurlencode($city); 
//prints S%C3%B8borg%2CDenmark 

そして:

$xml = file_get_contents('http://www.google.com/ig/api?weather='.$city); 
$xml = mb_convert_encoding($xml, 'UTF-8'); 
$xml = simplexml_load_string($xml); 
echo $xml->weather->forecast_information->city['data']; 

出力が期待される:私はしてから変換してる何

Søborg, Capital Region of Denmark 
+0

優秀! 「C3」を「%C3%B8」に変換するには、正しい方法を教えてください。組み込み関数はありますか? – Lowkey

+0

'%s%C3%B8borg'を返す – sanmai

+0

実際にはそうですが、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

0

実際に文字セットの問題のように聞こえます。 URLを別のエンコードに変換しようとしましたか?結果をsimplexml_load_file()に渡す前にiconvを使用していますか?

+0

かなりわかりません。 私は 'iconv(" ISO-8859-1 "、" UTF-8 "、$ file)'を試してみました。 'utf8_encode($ file)'も結果を返しません。 – Lowkey

0

これを試してみてください:

$file = "http://www.google.com/ig/api?weather=" . $geo_city . "," . $geo_country; 
$data = file_get_contents($file); 
$data = mb_convert_encoding($data, "UTF-8", "ISO-8859-2"); 

$xml = simplexml_load_string($data); 
echo "<pre>"; print_r($xml); echo "</pre>"; 

それは、この多分同様のスレッドから取られています:あなたはURLデコードS%26oslash%3Bborgあなたはこの文字列はS&oslash;borgに対応していることがわかります場合https://stackoverflow.com/a/5136549/949476

+0

このURLでサービスが呼び出されたような応答はまだ空です:[http://www.google.com/ig/api?weather=s](http://www.google.com/ ig/api?weather = s)。 – Lowkey

+0

このコードを実行するだけで、 '$ data = file_get_contents(" http://www.google.com/ig/api?weather=Sborg,Denmark ");'応答も空ですか? – dfsq

+0

はい、上記と同じ意味で空です。 私は_some_ xmlを元に戻しますが、予測データはありません。 – Lowkey

関連する問題