为什么URI.escape()标记为过时,这个REGEXP :: UNSAFE常量在哪里?

我试图弄清楚ruby 2.2.3中URI.escape的默认不安全字符集是什么。 文档说:

默认情况下使用REGEXP :: UNSAFE

但我无法在URI模块中的任何位置找到常量。

此外, 此代码 (下面的代码段)自2009年以来标记为“过时”的escape / unescape方法。为什么它们已经过时了?

lib/uri/common.rb:97 def escape(*arg) warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE DEFAULT_PARSER.escape(*arg) end 

文档是错误/过时了吗?

我看到你回答了你的问题: UNSAFE 。 至于这个问题:

此外, 此代码自2009年以来标记为“过时”的escape / unescape方法。为什么它们已经过时了?

在2010年12月的问题中有一些背景: https : //bugs.ruby-lang.org/issues/4167在那个post中,Yui Naruse写道:

URI lib表示它引用RFC2396,因此其规范中的当前行为是正确的。

是的,我知道目前的行为不是你所期望的。 因此我们计划更改lib以引用RFC3986。

此外,当前的URI.encode是简单的gsub。 但我认为应该将URI拆分为组件,然后转义每个组件,最后加入它们。

因此,当前的URI.encode被认为是有害的并且已被弃用。 这将被删除或彻底改变行为。

目前有什么替代品?

如上所述,当前URI.encode在规范级别上是错误的。 所以我们不会提供确切的替代品。 替换因用例而异。

我们认为大多数用例是从连接的URI组件生成转义的URI。 为此,人们应该使用URI.join或URI.encode_www_form; 你应该在加入之前逃避每个组件。

事实certificate,关于默认常量,文档并不十分准确。 如果我们看一下

https://github.com/ruby/ruby/blame/trunk/lib/uri/rfc2396_parser.rb#L299

它不再是常量,而是哈希的成员。 所以可以像这样检查默认值:

 > URI::DEFAULT_PARSER.regexp[:UNSAFE] => /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/ 

编辑:看起来你可以简单地得到它:

 > URI::UNSAFE => /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/