2010年
1月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2010-01-31 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もいろいろな種類があるのかも知れないけど。