PHP simplexml_load_file,URL中包含特殊字符

时间:2012-01-20 14:17:37

标签: php url character-encoding

我正在尝试根据用户的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的参数,但这只是绕过问题,而不是解决问题。

3 个答案:

答案 0 :(得分:1)

如果您对S%26oslash%3Bborg进行网址解码,您会看到此字符串对应于S&oslash;borg,在我们解码HTML实体之后会给我们Søborg

$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

答案 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