我正在尝试根据用户的IP检索本地天气预报。
我正在使用geoplugin.net获取用户位置,并将城市和国家/地区名称提供给Google Weather 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上尝试时,我会得到丹麦的Søborg(这不是100%准确,但足够接近),这让我几乎没有来自天气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
但是这个版本返回了Borg,Syddanmark的预测:
http://www.google.com/ig/api?weather=S%26oslash%3Bborg,Denmark
当送到simplexml_load_file()时,上述所有内容都不会返回所需的结果。
如上所述,我怀疑这是一个字符集问题,但我无法弄清楚如何处理它。
解决问题的正确方法是什么?
我知道我可以使用纬度和经度作为Google Weather API的参数,但这只是绕过问题,而不是解决问题。
答案 0 :(得分:1)
如果您对S%26oslash%3Bborg
进行网址解码,您会看到此字符串对应于Søborg
,在我们解码HTML实体之后会给我们Søborg
:
$city = 'S%26oslash%3Bborg,Denmark';
echo $city = rawurldecode($city);
//prints Sø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
答案 1 :(得分:0)
确实听起来像是字符集问题。您是否尝试将网址转换为其他编码,例如在将结果传递到simplexml_load_file()
之前使用iconv?
答案 2 :(得分: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>";
它取自这个类似的线程:https://stackoverflow.com/a/5136549/949476