疑問符 (?) のURLエンコード

疑問符 (?) を%3FにURLエンコードする方法を解説。?がクエリ文字列の区切りとして予約されている理由とエンコードが必要な場面を理解しましょう。

Character

?

Encoded

%3F

詳細な説明

疑問符(?)はURLにおいて最も構造的に重要な文字の一つです。パスとクエリ文字列の間の区切り文字として機能します。リテラルの疑問符がパラメータ値やパスセグメント内に現れる必要がある場合は、%3Fにエンコードしなければなりません。

percent-encoding形式: %3Fは疑問符を表します(ASCIIコード63、16進数で0x3F)。エンコードすることで、URLパーサーがこれを新しいクエリ文字列の開始として解釈するのを防ぎます。

URL構造のおさらい: https://example.com/path?key=valueにおいて、?はクエリパラメータの開始を示します。URL内で最初の?のみがこの特別な意味を持ち、クエリ文字列内の後続のエンコードされていない疑問符は技術的には有効ですが、実装間で一貫性のない解析を引き起こす可能性があります。

JavaScriptでの動作:

encodeURIComponent("What is this?") // "What%20is%20this%3F"
encodeURI("What is this?")          // "What%20is%20this?" (? をエンコードしない)

これもencodeURI()encodeURIComponent()が大きく異なるケースです。encodeURI()は完全なURIを対象に設計されているため、?を構造要素として保持します。疑問符を含む可能性のある値をエンコードする場合はencodeURIComponent()を使用してください。

エンコードが必要なよくあるシナリオ:

  • 自然言語の質問を検索クエリとして渡す場合:/search?q=How%20do%20I%20encode%3F
  • あるURLを別のURLのパラメータとして埋め込む場合:/redirect?url=https%3A%2F%2Fexample.com%2Fpage%3Fid%3D5
  • 疑問符を含むファイル名やリソース識別子
  • ユーザー生成コンテンツから構築されるURL(予期しない?の出現)

落とし穴: リダイレクトURLを構築する際、開発者はしばしば遷移先URLをクエリパラメータとして渡します。遷移先URL自体がクエリ文字列(?&を含む)を持つ場合、遷移先全体を単一の値としてエンコードする必要があります。これを怠ると、外側のURLパーサーが内側のURLのパラメータを吸収し、リダイレクトの失敗やオープンリダイレクト脆弱性につながる可能性があります。

ユースケース

遷移先URL自体がクエリパラメータを含むリダイレクトURLの構築。例えば、OAuthコールバックURLやメール認証リンクなど。

Try It — URL Encoder

フルツールを開く