高木のブログ

【Ruby】URI.escapeとCGI.escapeの違い

2020/10/07

URIエンコードにURI.escapeを使っていたらRubocopに怒られてしまった
どうやら時代遅れらしい
URI.escapeの代わりにCGI.escapeを使うことにした

Lint/UriEscapeUnescape: URI.escape method is obsolete and should not be used. Instead, use CGI.escape, URI.encode_www_form or URI.encode_www_form_component depending on your specific use case.

URI.escapeメソッドは時代遅れであり、使用すべきではありません。代わりに、CGI.escape、URI.encode_www_form、またはURI.encode_www_form_componentを使用してください。 (Deepl翻訳)

URI.escapeとCGI.escapeの違い

どちらもURIエンコードに使うメソッドではあるが、エスケープ処理の仕様が少し違う
今回自分が使う用途では問題なかったが、注意しないと事故る

URI.escape

スラッシュなどの記号をエスケープしない

URI.escape('おはよう') #=> "%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86"
URI.escape('http://example.com/') #=> "http://example.com/"
URI.escape('><;') #=> "%3E%3C;"
URI.encode('-._') #=> "-._"
URI.escape(' ') #=> "%20"
URI.escape('+') #=> "+"

CGI.escape

-._以外の記号は基本エスケープする
スペースは+に変換する

require 'cgi'

CGI.escape('おはよう') #=> "%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86"
CGI.escape('http://example.com/') #=> "http%3A%2F%2Fexample.com%2F"
CGI.escape('><;') #=> "%3E%3C%3B"
CGI.escape('-._') #=> "-._"
CGI.escape(' ') #=> "+"
CGI.escape('+') #=> "%2B"

動作確認で使用したRubyバージョン: 2.6.5

参考


Pixela