Использование CGI.escape не очень хорошая идея, так как дает неожиданные результаты. Попробуйте "Осло, Норвегия" с и без CGI.escape, вы поймете, что я имею в виду.
Лучшее решение - использовать Iconv на месте:
ic = Iconv.new('US-ASCII//IGNORE', 'UTF-8')
utf8location = ic.iconv(location)
ура!
РЕДАКТИРОВАТЬ: У меня было предложение Уэса Гэмбла для редактирования здесь, которое я считаю уместным:
Использование //IGNORE
удалит все не-ASCII символы. Но во многих (большинстве) случаях вы можете захотеть транслитерировать определенные символы, такие как умлауты (например, «Цюрих» станет «Цюрих») или Carons (например, «Ниш» станет «Ниш»), чтобы успешно геокодировать их. Если вы игнорируете символы, не входящие в ASCII, то «Zürich» станет «Zrich», а «Niš» станет «Ni», ни один из которых не будет успешно геокодирован.
Для этого вы хотите использовать
ic = Iconv.new('US-ASCII//TRANSLIT', 'UTF-8')
Обратите внимание, что преобразование вызовет исключение, если транслитерация не может быть завершена, поэтому убедитесь, что вы справились с этим.