Ruby 2.7 では URI.escape が廃止になったとされていますが、これに代わるものは何でしょうか?
概要
URI.encode を使用して HTML データ URL を生成しています。
visit "data:text/html,#{URI::encode(html)}"
Ruby 2.7.1 にアップグレードした後、インタープリターは次の警告を出し始めました。
warning: URI.escape is obsolete
これに代わるものとして推奨されるのは、CGI.escape と URI.encode_www_form_component です。ただし、彼らは同じことをしているわけではありません。
2.7.1 :007 > URI.escape '<html>this and that</html>'
(irb):7: warning: URI.escape is obsolete
=> "%3Chtml%3Ethis%20and%20that%3C/html%3E"
2.7.1 :008 > CGI.escape '<html>this and that</html>'
=> "%3Chtml%3Ethis+and+that%3C%2Fhtml%3E"
2.7.1 :009 > URI.encode_www_form_component '<html>this and that</html>'
=> "%3Chtml%3Ethis+and+that%3C%2Fhtml%3E"
これらのわずかなエンコーディングの違いの結果、HTML ページではスペースが + に置き換えられます。私の質問は、この使用例で URI.encode の代わりになるものは何でしょうか?
解決策
実際に代替品の減少が発生しています。
s = '<html>this and that</html>'
p = URI::Parser.new
p.escape(s)
=> "%3Chtml%3Ethis%20and%20that%3C/html%3E"
ドキュメント: https://docs.w3cub.com/ruby~3/uri/rfc2396_parser
この記事の下のコメントを通じてこれを見つけました https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://docs.knapsackpro.com/2020/uri-escape-is-obsolete-percent-encoding-your-query-string
また、これをセットアップ内の他の文字列に対してテストしました。これも、ERB::Util.url_encode とは対照的に、URI.escape と同じ方法でカンマを保持しているようです。
注記: この回答は現在非常に人気があるため、プロジェクトに標準準拠のエンコーダーが必要ないことが確実でない限り、URI::Parser を使用するようにコードを盲目的に変更すべきではないことはおそらく言及する価値があります。 URI.escape は実際には理由があって非推奨になっているためです。したがって、単純に URI::Parser に切り替える前に、https://stackoverflow.com/a/13059657/6376353 を読んで理解していることを確認してください。