# URI.escape() broken or misdocumented in Ruby 1.8.4

**URL:** <https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430>\
**Category:** Rails\
**Created:** [July 7, 2006, 1:19am UTC](https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430 "2006-07-07T01:19:58Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![pond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7ab992/32.png) [@pond](https://www.ruby-forum.com/u/pond)\
**Post date:** [July 7, 2006, 1:19am UTC](https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430/1 "2006-07-07T01:19:58Z")

</div>

URI.escape() is supposed to be able to take a second parameter listing  
unsafe characters in the URI. This may be a regexp or string. If a  
string, it’s supposed to represent a character set listing all unsafe  
characters. An example given in the core documentation at:

[http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992](http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992)

…is:

p URI.escape(“@?@!”, “!?”)

# =\> “@%3F@%21”

Unfortunately this doesn’t work. It seems that the string does not  
represent a character set to match any more, but a literal string to  
find - thus the following result is actually seen:

p URI.escape(“@?@!”, “!?”)

# =\> “@?@!”

p URI.escape(“@?@!”, “@?”)

# =\> “%40%3F@!”

Matching strings in this way is thoroughly bizarre as highlighted by the  
above example; “@” is being escaped for the substring “@?” but not for  
the substring “@!”. The way to get the documented style of substitution  
is rather clumsy; one must manually construct the character set:

p URI.escape(“@?@!”, Regexp.new(“[!?]”))

# =\> “@%3F@%21”

I was going to update the documentation Wiki to mention the differing  
behaviour in Ruby 1.8.4 by clicking on the link given at the bottom of  
the page, which goes to:

[http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992](http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992)

…but this gives a blank page. In fact the whole Wiki seems to be a bit  
broken, with little documentation actually apparently existing and the  
search engine failing to find anything at all under “URI”. Am I missing  
something here?

---

<div class="post-metadata">

**Author:** ![pond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7ab992/32.png) [@pond](https://www.ruby-forum.com/u/pond)\
**Post date:** [July 7, 2006, 1:22am UTC](https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430/2 "2006-07-07T01:22:00Z")

</div>

Andrew H. wrote:

> [http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992](http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/Escape.html#M008992)

The second time that appeared, it should of course have read:

[http://www.ruby-doc.org/ru/wiki/index.rb/Core/URI::Escape](http://www.ruby-doc.org/ru/wiki/index.rb/Core/URI::Escape)

---

<div class="post-metadata">

**Author:** ![pond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7ab992/32.png) [@pond](https://www.ruby-forum.com/u/pond)\
**Post date:** [July 7, 2006, 8:18pm UTC](https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430/3 "2006-07-07T20:18:48Z")

</div>

For the sake of searchable archives, further information can be found on  
the Ruby list; see:

[http://www.ruby-forum.com/topic/72072](http://www.ruby-forum.com/topic/72072)

---

<div class="post-metadata">

**Author:** ![pond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7ab992/32.png) [@pond](https://www.ruby-forum.com/u/pond)\
**Post date:** [July 7, 2006, 8:48pm UTC](https://www.ruby-forum.com/t/uri-escape-broken-or-misdocumented-in-ruby-1-8-4/97430/4 "2006-07-07T20:48:49Z")

</div>

> p URI.escape("@?@!", Regexp.new("[!?]"))
> 
> # =\> “@%3F@%21”

p URI.escape("@?@!", /[!?]/)  
#=\> “@%3F@%21”

It may be misdocumented, but why would you use anything other than a  
Regexp here?

\_Kevin
