2

MVCアプリケーションでは、クエリ文字列を動的に作成することがあります。1回はjavascriptから、もう1回はc#サーバーコードからです。javascriptでは、を使用してencodeURIComponent(value)おり、c#からはからのHttpUtility.UrlEncode(value)メソッドを使用していますSystem.Web

例:aq:にスペースがあるとします。value

  • encodeURIComponent(value)%20qを返します
  • HttpUtility.UrlEncode(value)a+qを返します

スペースは、これら2つの方法を使用して、異なる方法でエンコードされます。それがこのように機能している理由は、「昔のように書かれていて、手つかずのままである」とは違うのでしょうか。

さらに、たとえば、a+qにプラスがあるとします。value

  • encodeURIComponent(value)%2Bqを返します
  • HttpUtility.UrlEncode(value)%2bqを返します

jsメソッドは大文字でエンコードされた文字を返し、c#oneは小文字を返します。

アプリケーションを一貫した方法で動作させるために、これら2つの方法と並行して連携するための最良の方法は何ですか?jsメソッドの動作を模倣するための代替のc#メソッドを作成しますか?デコード方法も同じ違いがあると思います。これらを扱う「正しい」方法はありますか?

4

1 に答える 1

3

パーセントエンコーディングはRFC3986で定義されています。スペース文字がとしてエンコードされることを定義し%20ます。ただし、クエリ文字列はほとんどの場合application / x-www-form-urlencoded+形式であり、。の代わりにスペースをエンコードすることもできます%20。デコーダーがこの形式のクエリ文字列を予期している場合、エンコーダーは好みの文字列を選択できます。

スペースを常に次のようにエンコードする場合は、 Uri.EscapeDataStringメソッドを使用できます%20

var result = Uri.EscapeDataString("a q");
// result == "a%20q"

大文字と小文字について、RFC3986は次のように述べています。

大文字の16進数の「A」から「F」は、それぞれ小文字の「a」から「f」に相当します。パーセントエンコードされたオクテットで使用される16進数の場合にのみ、2つのURIが異なる場合、それらは同等です。

一貫性を保つために、URIプロデューサーとノーマライザーはすべてのパーセントエンコードに大文字の16進数を使用する必要があります。

var result = Uri.EscapeDataString("a+q");
// result == "a%2Bq"
于 2012-04-30T09:28:22.947 に答える