Я пытаюсь получить локальный прогноз погоды на основе IP-адреса пользователя.
Я использую geogugin.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-адресе, я получаю 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, но это просто обходит проблему, а не решает ее.
Если вы URL-декодируете S%26oslash%3Bborg
вы увидите, что эта строка соответствует Søborg
которая дает нам Søborg
после того, как мы декодируем объекты HTML следующим образом:
$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
Это действительно звучит как проблема с набором символов. Пробовали ли вы конвертировать URL в другую кодировку, например, с помощью iconv , перед передачей результата в simplexml_load_file()
?
Попробуйте это:
$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