3

二重エスケープせずに、必要に応じて URL をエスケープするにはどうすればよいですか?

すでにこれを行っている Ruby ライブラリはありますか? WebKit や Chrome はどのようなアルゴリズムを使用しているのだろうか。

2 つの例:

  • がエスケープされていないため、この URL は無効です%: http://x.co/op&k=21%。URL バーに入力すると、エスケープすることが認識されます。(バックグラウンドで「%」をエスケープしていますよね?)

  • ブラウザーに入力http://localhost:3000/?s=hello%20worldすると、ブラウザーは再びエスケープしない%20ことを認識します。

私は、ブラウザーが処理しなければならないエッジ ケースを既に処理している優れたコードを再利用したいと考えています。必要に応じて外部ライブラリを呼び出してもかまいません。

更新: はい、私はURI.parseについて知っています。構文を表示する必要はありません。私の質問それより難しいです。

4

2 に答える 2

1

これまでのところ、勝者は次のとおりです。

  • Addressable :: URI#normalize: "正規化されたURIオブジェクトを返します。注:このメソッドは、仕様に完全に準拠しようとはしません。これは主に、他の人の仕様の読み取りの失敗を修正するため、およびいくつかの異なるため、キャッシュの問題に対処するために存在します。 URIは同じリソースを表す場合があるため、複数回キャッシュしないでください。」

  • Addressable :: URI.heuristic_parse: "入力をURIに変換します。入力は有効なURIである必要はありません。メソッドはヒューリスティックを使用して意図されたURIを推測します。これは標準に準拠しておらず、単にユーザーフレンドリーです。 。」

于 2012-07-30T18:30:20.383 に答える
0

複数回エンコードまたはデコードする必要があるかどうかは、あなた次第です。あなたはプログラマーであり、URL を操作するときに URL がどのような状態であるかを認識する必要があります。

%ブラウザーは、数値が続かないa はそのままであり、エスケープする必要があると見なすことができます。詳細については、「Uniform Resource Identifier (URI): 一般的な構文」を参照してください。

Ruby の組み込みのURI、またはAddressable::URI gem を使用してエンコード/デコードできます。

require 'uri'

uri = URI.parse('http://x.co/op')
uri.query = URI.encode_www_form('k' => '21%')

puts uri.to_s # => http://x.co/op?k=21%25

また:

require 'addressable/uri'

uri = Addressable::URI.parse('http://x.co/op')
uri.query_values = {'k' => '21%'}
puts uri.to_s # => "http://x.co/op?k=21%25"
于 2012-07-30T17:07:35.690 に答える