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

I posted this in the Ruby On Rails forum a moment ago because of other
URI.escape() related messages there, but really it’s a Ruby thing, not a
Rails thing, so it belongs in the Ruby forum. Thus, a repost :slight_smile:

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

…is:

p URI.escape("@[email protected]!", “!?”)

=> “@%[email protected]%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("@[email protected]!", “!?”)

=> “@[email protected]!”

p URI.escape("@[email protected]!", “@?”)

=> “%40%[email protected]!”

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("@[email protected]!", Regexp.new("[!?]"))

=> “@%[email protected]%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/ru/wiki/index.rb/Core/URI::Escape

…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?

On 7/6/06, Andrew H. [email protected] wrote:

I posted this in the Ruby On Rails forum a moment ago because of other
URI.escape() related messages there, but really it’s a Ruby thing, not a
Rails thing, so it belongs in the Ruby forum. Thus, a repost :slight_smile:

I don’t have a clear answer to your question, below, but a couple of
points that MUST be made: You are not posting to a forum with
either the “Ruby on Rails ‘forum’” or the “Ruby ‘forum’”. You are
posting to a mailing list gateway. You are correct that this probably
belongs on ruby-talk (the mailing list to which your post has been
gatewayed) and comp.lang.ruby (the newsgroup to which the mailing list
is bidirectionally gatewayed). But it’s not a forum.

It does appear to be a documentation bug or a code bug that was
introduced; someone else will have to verify that.

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/ru/wiki/index.rb/Core/URI::Escape

I didn’t even know about this :wink:

I suspect that it’s not filled because it’s not how the documentation
is dealt with in Ruby.

Lastly, your example:

p URI.escape("@[email protected]!", Regexp.new("[!?]"))

=> “@%[email protected]%21”

Can be rewritten as:

p URI.escape("@[email protected]!", /[!?]/)

You don’t need Regexp.new.

-austin

“Austin Z.” [email protected] writes:

It does appear to be a documentation bug or a code bug that was
introduced; someone else will have to verify that.

This seems like a documentation bug. The second argument is used as-is
in calling String#gsub which matches whole-string when given a string
argument.

Note that the documentation in 1.8.4’s uri library code is correct.

YS.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs