RubyのCGI.escapeとURI.encodeについて


RubyのCGI.escapeURI.encodeはどちらもURIエンコードを行うためのメソッドです。基本的にはCGI.escapeを使うことが推奨されていますが、これまでのしくみと仕様を合わせたい場合もあるので、簡単に違いをまとめておきます。

🐹 CGI.escape

CGI.escapeでは次のようにエスケープされます。

require 'cgi'
CGI.escape('A B C') #=> "A+B+C"
CGI.escape("http://example.com/hoge/あいう/") #=> => "http%3A%2F%2Fexample.com%2Fhoge%2F%E3%81%82%E3%81%84%E3%81%86%2F"

CGI.escapeはCGIの仕様にもとづいてデータをエンコード、デコードするためのメソッドです。

🚕 URI.encode

URI.encodeでは次のようにエスケープされます。

require 'uri'
URI.encode('A B C') #=> "A%20B%20C"
URI.encode("http://example.com/hoge/あいう/") #=> "http://example.com/hoge/%E3%81%82%E3%81%84%E3%81%86/"

ただし、RFC-3896の仕様に準拠できているわけではないので注意が必要です。

🎃 CGI.escapeとURI.encodeの違い

  • URI.encodeはバックスラッシュ等は変換しない。CGI.escapeはすべてエスケープ

😸 [補足]RFC-3896に準拠:Addressable

RFC-3896、RFC-3987、RFC-6570に準拠する場合は、「Addressable」を使うと良さそうです。

require "addressable/uri"
uri = Addressable::URI.parse("http://www.詹姆斯.com/")
uri.normalize
#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>

😼 参考リンク

📚 おすすめの書籍