我试图弄清楚ruby 2.2.3中URI.escape的默认不安全字符集是什么。 docs说:
默认情况下使用REGEXP :: UNSAFE
但我无法在URI模块中的任何位置找到该常量。
此外,this code(下面的代码段)将escape / unescape方法标记为'已废弃'自2009年以来。为什么它们已经过时了?
lib/uri/common.rb:97
def escape(*arg)
warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE
DEFAULT_PARSER.escape(*arg)
end
文档是错误/过时了吗?
答案 0 :(得分:4)
事实证明,关于默认常量,文档并不十分准确。如果我们看一下
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;\/?:@&=+$,\[\]]/
答案 1 :(得分:4)
我看到你回答了问题:UNSAFE
。至于这个问题:
此外,this code自2009年起将escape / unescape方法标记为“过时”。为什么它们已过时?
在2010年12月的问题中有一些背景:https://bugs.ruby-lang.org/issues/4167在该线程中,Yui Naruse写道:
URI lib表示它引用RFC2396,因此其当前行为是正确的 规格。
是的,我知道目前的行为不是你所期望的。所以我们计划 更改lib以引用RFC3986。
此外,当前的URI.encode是简单的gsub。但我认为应该 将URI拆分为组件,然后转义每个组件,最后 加入他们。
因此,当前的URI.encode被认为是有害的并且已被弃用。这将 被删除或大幅改变行为。
目前有什么替代品?
正如我上面所说,当前的URI.encode在规范级别上是错误的。所以我们 不会提供确切的替代品。更换将因其而异 用例。
我们认为大多数用例是从加入的URI生成转义的URI 成品的配件。为此,人们应该使用URI.join或 URI.encode_www_form;你应该在加入之前逃避每个组件 它们。
答案 2 :(得分:1)
还有另一种选择,因此,如果您使用的是可寻址宝石,则可以使用其URI模块以及常规URI的::escape方法。
Addressable::URI.escape(value)