web-dev-qa-db-ja.com

カンマURLがエンコードされるのはなぜですか?

ASP.NET MVCでデバッグするとき、以下の違いがわかりません。

http://mysite.com?q=hi,bye

そして

http://mysite.com?q=hi%2Cbye

クエリ文字列パラメータ "q"の値は常に "hi、bye"です。

では、なぜカンマがエンコードされているのでしょうか?

私はこのようなことをしたい https://stackoverflow.com/a/752109/173957

私はこのフォームを持っています:

<form method="GET" action="/Search">
     <input type="hidden" name="q" value="hi,bye"/>
     <input type="submit" value="ok"/>
</form>

この値がエンコードされないようにするにはどうすればよいですか?

27
Scott Coates

URI仕様 RFC 3986 は、URIパスコンポーネントにエンコードされていない予約文字が含まれておらず、コンマが予約文字の1つであることを指定します。カンマなどのsub-delimsの場合、エンコードしないままにすると、文字がURIスキームでセパレータ構文として扱われる危険性があります。パーセントエンコーディングは、文字がデータとして渡されることを保証します。

19
Kyle Jones

不要な文字のリストを見つけましたURLエンコード: http://web.archive.org/web/20131212154213/http ://urldecoderonline.com/url-allowed-characters.htm

更新
元のリンクが壊れたため、2013年12月のページからarchive.orgを使用して次のテキストを取得しました

許可されたURL文字のリスト

予約なし-エンコードできますが、必須ではありません

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 - _ . ~

予約済み-ときどきエンコードする必要があります

! * ' ( ) ; : @ & = + $ , / ? % # [ ]
8
Alex

これは実際にはブラウザに依存しています。ブラウザはHTMLフォームを受け取り、フォームの入力に基づいてURLを構築する方法を決定します。

本当に古い(またはプログラムが不十分な)ブラウザーを使用している場合、コンマをエンコードしない可能性があります。 RFC標準に準拠している場合は、実際にエンコードする必要があります。

すべてのブラウザーでコンマがエンコードされないようにするには、JavaScriptを使用して、自分でURLを作成する必要があります。

<script lang="JavaScript">
    document.location.href = "/Search?q=hi,bye";
</script>

いずれにしても、クエリ文字列パラメーターをデコードする必要があるため、問題はありません。結果は同じになります。

2
JackAce