PHP simplexml_load_file со специальными символами в URL-адресе

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

Related of "PHP simplexml_load_file со специальными символами в URL-адресе"

Если вы 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 

Это действительно звучит как проблема с набором символов. Пробовали ли вы конвертировать 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