URL特殊文字のエスケープについて整理しておく

HaskellCGI がうまく動かないので Ruby を使用して URL特殊文字エスケープについて整理しておきます。


irb(main):004:0> URI.escape("あ")
=> "%E3%81%82"
irb(main):008:0> uri=URI.escape("あ")
=> "%E3%81%82"
irb(main):011:0> URI.unescape uri
=> "あ"

Ruby では URI::UNSAFE によって定義されている。

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

irb(main):013:0> URI::UNSAFE=~ "abc"
=> nil
irb(main):014:0> URI::UNSAFE=~ "あ"
=> 0
irb(main):015:0> URI::UNSAFE=~ "012345あ"
=> 6

URLに使用出来ない文字は %を付けたバイナリ16進文字なので文字コードによって異なる。


$ cat uri.rb
require "uri"
p URI.escape("あ")

$ cat uri.rb|nkf -w|nkf -g
UTF-8
$ cat uri.rb|nkf -w>utf8.rb
$ ruby utf8.rb
"%E3%81%82"
$ echo "あ"|nkf -w| hd
00000000 e3 81 82 0a

$ cat uri.rb|nkf -e|nkf -g
EUC-JP
$ cat uri.rb|nkf -e>euc.rb
$ ruby euc.rb
"%A4%A2"
$ echo "あ"|nkf -e| hd
00000000 a4 a2 0a

$ cat uri.rb|nkf -s|nkf -g
Shift_JIS
$ cat uri.rb|nkf -s>sjis.rb
$ ruby sjis.rb
"%82%A0"
$ echo "あ"|nkf -s| hd
00000000 82 a0 0a

これは RFC3986(日本語訳) に定義されているらしい。