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("@?@!", "!?")
  # => "@%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/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?

···

--
Posted via http://www.ruby-forum.com/.

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("@?@!", Regexp.new("[!?]"))
   # => "@%3F@%21"

Can be rewritten as:

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

You don't need Regexp.new.

-austin

···

On 7/6/06, Andrew Hodgkinson <ahodgkin@rowing.org.uk> wrote:
--
Austin Ziegler * halostatue@gmail.com * http://www.halostatue.ca/
               * austin@halostatue.ca * You are in a maze of twisty little passages, all alike. // halo • statue
               * austin@zieglers.ca

"Austin Ziegler" <halostatue@gmail.com> 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.