URI.escape(foo, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
найдено здесь: Как кодировать / декодировать необработанный URL в JavaScript и Ruby, чтобы получить одинаковые значения в обоих?
CGI.escape
должен экранировать правильно, за исключением того, что пробелы экранируются как +
.
Обратите внимание, что URI.escape
устарел в Ruby 1.9.2 ...
Для тех, кто интересуется, идет длинное обсуждение ruby-core .