encodeのバグ?


urlencodeとhtmlencode
httpでアクセスするときには、特殊な文字をencodeやdecodeする必要が出てくる。その代表的なものが、urlencodeとhtmlencodeである。これらをrubyで扱うときには、それぞれURI.escapeとCGI.escapeHTMLを使えば良い。ちなみに、これらはそれぞれ"uri",“cgi"をrequireしてから使用する。URI.escapeの場合には、デフォルトではURI::UNSAFEで定義された文字をencodeする。しかし、このUNSAFEの定義が変な気がする。試しにURI::UNSAFEをpしてみると、

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

となる。これだと”[“や”]“はencodeされないことになるが、encodeするべきのようだ。uri/common.rbを覗いてみると、次のように定義されている。

ALPHA = "a-zA-Z"
ALNUM = "#{ALPHA}\\d"
UNRESERVED = "-_.!~*'()#{ALNUM}"
RESERVED = ";/?:@&=+$,\\[\\]"
UNSAFE  = Regexp.new("[^#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}]", false, 'N').freeze

RESERVEDとUNRESERVEDの意味は分からないけど、

UNSAFE  = Regexp.new("[^#{PATTERN::UNRESERVED}]", false, 'N').freeze

が正しい気がする。urlencodeもいろいろな種類があるのかも知れないけど。