2012-01-20 2 views
2

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

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

ответ

1

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

Отлично! Можете ли вы также рассказать мне, какой правильный путь, превратить «ø» в% C3% B8? Есть встроенная функция? – Lowkey

+0

'rawurlencode ('Søborg');' возвращает 'S% C3% B8borg' – sanmai

+0

Действительно, но строка, которую я получаю из файла gelugin.net xml, кажется (согласно' mb_detect_encoding() ') для ASCII , поэтому, когда я 'rawurlencode()' it, я получаю 'S% 26oslash% 3Bborg' возвращенное. Я искал [способ конвертировать ASCII в UTF-8] (http://stackoverflow.com/questions/4983989/convert-ascii-to-utf-8-encoding) и узнал, что ASCII на самом деле является подмножество UTF-8. Я пробовал '$ string = iconv ('ASCII', 'UTF-8 // IGNORE', $ geo_city); \t echo mb_detect_encoding ($ string); 'как предложено в ссылке, и он по-прежнему возвращает ASCII. – Lowkey

0

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

+0

Не совсем уверен, что я преобразование и из. Я пробовал как «iconv» («ISO-8859-1», «UTF-8», $ file) », так и наоборот без успеха. 'utf8_encode ($ file)' тоже не дает результата. – Lowkey

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

+0

Ответ по-прежнему пуст, как если бы служба была вызвана с этим URL-адресом: [http://www.google.com/ig/api?weather=s](http://www.google.com/ мкг/апи? погода = s). – Lowkey

+0

Итак, если вы просто запустите этот код '$ data = file_get_contents (« http://www.google.com/ig/api?weather=Søborg,Denmark »),' ответ также пуст? – dfsq

+0

Да, пустой в том же смысле, что и выше. Я получаю _some_ xml обратно, но в нем нет данных прогноза. – Lowkey

Смежные вопросы