PHP simplexml_load_file со специальными символами в URL - PullRequest
2 голосов
/ 20 января 2012

Я пытаюсь получить местный прогноз погоды на основе IP-адреса пользователя.

Я использую геоплугирование для определения местоположения пользователя и ввода имени города и страны в API погоды Google.

<code>//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 "
";

Это работает хорошо в большинстве случаев, но когда я пробую это на своем собственном 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 ]

1 голос
/ 23 января 2012

Если вы URL-декодируете S%26oslash%3Bborg, вы увидите, что эта строка соответствует S&oslash;borg, что дает нам 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 голосов
/ 20 января 2012

Попробуйте это:

<code>$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 "
";

Это взято из этой, возможно, похожей темы: https://stackoverflow.com/a/5136549/949476

0 голосов
/ 20 января 2012

Это действительно звучит как проблема набора символов.Вы пытались преобразовать URL в другую кодировку, например, используя iconv , перед передачей результата в simplexml_load_file()?

...