1706499222
2024-01-25 11:59:49
短い答え、Ruby文字列のエンコード
2024年版は次のとおりです。
1
URI::Parser.new.escape(my_url_string)
すでにいっぱいです スタックオーバーフローの質問 これについては、Ruby 3 以降では、(大幅な調整なしで) 動作する唯一のバージョンは上記のもののようです。
完全な例:
1
2
3
4
5
6
7
8
require 'uri'
my_string = "hello world"
my_url_string = "https://somedomain.com?word=#{my_string}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello%20world"
例外: エスケープされていない文字
ただし、引用符を渡そうとすると、これは機能しません。
1
2
3
4
5
6
7
require 'uri'
my_string = "hello?world"
my_url_string = "https://somedomain.com?word=#{my_string}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello?world"
これには少しのハックが必要です .gsub('?', '%3F')
1
2
3
4
5
6
7
require 'uri'
my_string = "hello?world"
my_url_string = "https://somedomain.com?word=#{my_string.gsub('?', '%3F')}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello%253Fworld"
なぜちょっとしたハックをするのか? まあ、深く掘り下げる時間はありませんでしたが、 escape ただし、引用符がすでに通常の URL の一部である (クエリ文字列の区切り文字である) という事実を考慮すると、この文字はエンコードされていないと思います。
それでは、エンコードを試してこの仮定を押し広げてみましょう :// (この部分は演習として残しました:)
…
OK、それらはエンコードされていません。 それが最後の段落につながります。
Ruby における URL 文字列エンコーディングの堅牢性
他の方法もいくつか試しましたが、現時点では間違いなくこれが効果的です。 トピックのタイトルに意図的に年を記載したのは、この答えがたとえば 2 年か 3 年後も有効かどうか完全に確信が持てないためですが、現時点では、これが私が見つけた中で間違いなく最も堅牢な方法です (つまり遠い)。
というキャラクターとは別に、 実は 通常の URL に属していますが、他にトリッキーなものは見つかりませんでした。
ユースケースに応じて、これらの文字をエスケープすることが良いアイデアになる場合もあれば、悪いアイデアになる場合もあります。
結論
この結論には特別なことは何もありません。この記事のおかげで今日 5 分を勝ち取っていただければ幸いです 🙂
最高、
デビッド。
#RubyでURL文字列をエンコードする方法