83

Given the string:

"Hello there world"

how can I create a URL-encoded string like this:

"Hello%20there%20world"

I would also like to know what to do if the string has other symbols too, like:

"hello there: world, how are you"

What would is the easiest way to do so? I was going to parse and then build some code for that.

Mischa
  • 42,876
  • 8
  • 99
  • 111

4 Answers4

138

In 2019, URI.encode is obsolete and should not be used.


require 'uri'

URI.encode("Hello there world")
#=> "Hello%20there%20world"
URI.encode("hello there: world, how are you")
#=> "hello%20there:%20world,%20how%20are%20you"

URI.decode("Hello%20there%20world")
#=> "Hello there world"
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
Arie Xiao
  • 13,909
  • 3
  • 31
  • 30
31

While the current answer says to utilize URI.encode that has been deprecated and obsolete since Ruby 1.9.2. It is better to utilize CGI.escape or ERB::Util.url_encode.

Ben
  • 733
  • 8
  • 25
  • 1
    This answer is correct. CGI.escape("www.foo.com/more/here") works now. Key difference is slash's "/", semicolons ":" and array notation "[" "]" started encoding. Thanks! – bubbaspike Dec 28 '21 at 22:05
21

If anyone is interested, the newest way to do this is doing in ERB:

    <%= u "Hello World !" %>

This will render:

Hello%20World%20%21

u is short for url_encode

You can find the docs here

oschvr
  • 422
  • 7
  • 15
20

Ruby's URI is useful for this. You can build the entire URL programmatically and add the query parameters using that class, and it'll handle the encoding for you:

require 'uri'

uri = URI.parse('http://foo.com')
uri.query = URI.encode_www_form(
  's' => "Hello there world"
)
uri.to_s # => "http://foo.com?s=Hello+there+world"

The examples are useful:

URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"

These links might also be useful:

Community
  • 1
  • 1
the Tin Man
  • 158,662
  • 42
  • 215
  • 303