Hatena::Grouprubyist

Rubyで遊ぶよ

 | 

2009-02-26

RubyでencodeURI、encodeURIComponentっぽいものを作る。

03:17

JavaScript の encodeURIComponent と encoeURI みたいなもの (ry

CGI.escapeURI.escape がそれぞれ近いような気もするが、微妙に違う。

URI.escape(str[, unsafe])

URI.encode(str[, unsafe])

URI 文字列をエンコードした文字列を返します。unsafe には、URI

として指定できない文字を正規表現か文字列で指定します(デフォルトは、

定数 URI::UNSAFE

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

です)。

URI - Rubyリファレンスマニュアル

だそうな。

というわけで、この正規表現に手を加えてみる。

#!/usr/bin/ruby -Ku
require 'cgi'
require 'uri'

code = [
        ' ', '!', '"',  '#', '$', '%', '&', '\'', '(', ')', '*',
        '+', ',', '-',  '.', '/', ':', ';', '<',  '=', '>', '?',
        '@', '[', '\\', ']', '^', '_', '`', '{',  '|', '}', '~',
        '', ''
        ];

code.each do |c|
  print c
  print "\t\t"
  print CGI.escape(c) 
  print "\t\t"
  print URI.escape(c)
  print "\t\t"
  print URI.escape(c,/[^-_.!~*'()a-zA-Z\d;\/?:@&=+$,#]/n)  # encodeURI っぽいもの
  print "\t\t"
  print URI.escape(c,/[^-_.!~*'()a-zA-Z\d?@]/n) # encodeURIComponent っぽいもの
  print "\n"
end

結果。

文字CGI.escapeURI.escapeencodeURIっぽいものencodeURIComponentっぽいもの
+%20%20%20
!%21!!!
"%22%22%22%22
#%23%23#%23
$%24$$%24
%%25%25%25%25
&%26&&%26
'%27'''
(%28(((
)%29)))
*%2A * * *
+%2B++%2B
,%2C,,%2C
-----
.....
/%2F//%2F
:%3A::%3A
;%3B;;%3B
<%3C%3C%3C%3C
=%3D==%3D
>%3E%3E%3E%3E
?%3F??%3F
@%40@@%40
[%5B[%5B%5B
\%5C%5C%5C%5C
]%5D]%5D%5D
^%5E%5E%5E%5E
_____
`%60%60%60%60
{%7B%7B%7B%7B
|%7C%7C%7C%7C
}%7D%7D%7D%7D
~%7E~~~
%E6%BC%A2%E6%BC%A2%E6%BC%A2%E6%BC%A2
%E8%A1%A8%E8%A1%A8%E8%A1%A8%E8%A1%A8

ちなみに Ruby 1.8.6。

この表と見比べる限り、これで合ってるっぽい。


Python でもやってみた。

ArmandoArmando2013/01/15 00:01What I find so itneresting is you could never find this anywhere else.

vxzzdzrlnnuvxzzdzrlnnu2013/01/16 00:49TQFw36 , [url=http://onxwpoovtbrj.com/]onxwpoovtbrj[/url], [link=http://pmcrfuuzqrgh.com/]pmcrfuuzqrgh[/link], http://fhhsassreehr.com/

ojlltwpsojlltwps2013/01/17 05:54m6iC2v <a href="http://kimzviuctnib.com/">kimzviuctnib</a>

ulrnimeqxkfulrnimeqxkf2013/01/17 12:45NsKnOD , [url=http://umhkzjsvegpn.com/]umhkzjsvegpn[/url], [link=http://nyoisltgkote.com/]nyoisltgkote[/link], http://ayllfozogmqq.com/

 |