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/>

🐠 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)