Я пытаюсь получить локальный прогноз погоды на основе 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 я могу использовать широту и долготу, но это просто обойти проблему, а не решить ее.
Отлично! Можете ли вы также рассказать мне, какой правильный путь, превратить «ø» в% C3% B8? Есть встроенная функция? – Lowkey
'rawurlencode ('Søborg');' возвращает 'S% C3% B8borg' – sanmai
Действительно, но строка, которую я получаю из файла 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