答えは簡単ではありません。
以下は、RFC3986のセクション3.2.2から抜粋したものです。
インターネットプロトコルリテラルアドレス、バージョン6
[RFC3513]以降で識別されるホストは、IPリテラル
を角かっこ("["および"]")で囲むことによって区別されます。
これは、URI構文で角括弧文字が許可される唯一の場所です。
これは、URIの他の場所では角かっこは使用できないことを明確に示すことで質問に答えているようです。ただし、角括弧文字とパーセントエンコードされた角括弧文字には違いがあります。
以下は、RFC3986のセクション3の冒頭から抜粋したものです。
構文コンポーネント
一般的なURI構文は
、スキーム、権限、パス、クエリ、および
フラグメントと呼ばれるコンポーネントの階層シーケンスで構成されます。
URI=スキーム":" hier-part ["?" クエリ]["#"フラグメント]
したがって、「クエリ」は「URI」のコンポーネントです。
以下は、RFC3986のセクション2.2から抜粋したものです。
2.2。予約文字
URIには、「予約済み」セットの文字で区切られたコンポーネントとサブコンポーネントが含まれます。これらの文字は
、一般的な構文、各スキーム固有の構文、または
URIの間接参照アルゴリズムの実装固有の構文によって
区切り文字として定義される場合と定義されない場合があるため、「予約済み」と呼ばれます。
URIコンポーネントのデータが
区切り文字としての予約文字の目的と競合する場合は
、URIが形成される前に、競合するデータをパーセントエンコードする必要があります。
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
したがって、角かっこはクエリ文字列に表示される場合がありますが、パーセントエンコードされている場合に限ります。そうでない場合を除いて、セクション2.2でさらに説明します。
URI生成アプリケーションは、予約済みセットの文字に対応するデータオクテットをパーセントエンコードする必要があります。ただし、これらの文字
がURIスキームによってその
コンポーネントのデータを表すことが特に許可されている場合を除きます。予約文字がURIコンポーネントで見つかり、その文字の区切りの役割がわからない場合
は、US-ASCIIでのその文字のエンコーディングに
対応するデータオクテットを表すものとして解釈
する必要があります。
したがって、角かっこは「ホスト」サブコンポーネントでのみ許可されるため、RFC 3986でエンコードされていない角かっこでデータを表すことが明示的に許可されていない限り、他のコンポーネントやサブコンポーネント、この場合は「クエリ」コンポーネントでパーセントエンコードする必要があります。クエリコンポーネントはありません。
ただし、「URI生成アプリケーション」が「すべき」ことを実行できない場合、クエリで角かっこをエンコードしないままにしておくと、URIのリーダーはURIを完全に拒否することはありません。代わりに、角かっこはクエリコンポーネントのデータに属していると見なされます。これは、角かっこがそのコンポーネントの区切り文字として使用されていないためです。
これが、たとえば、PHPがエンコードされていない角括弧とパーセントエンコードされた角括弧の両方をクエリ文字列の有効な文字として受け入れ、それらに特別な目的を割り当てる場合でも、RFC3986の違反ではない理由です。ただし、角かっこをパーセントエンコードしないことでこの抜け穴を利用しようとする作成者は、RFC3986に違反しているように見えます。