URLで安全な文字(未予約文字)

エンコードなしでURLに使用できる安全な文字を解説。RFC 3986で定義された未予約文字セットと実用的な使い方を学びましょう。

詳細な説明

RFC 3986は、percent-encodingなしでURLのどの部分にも使用できる「未予約文字」のセットを定義しています。これらは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
- _ . ~

つまり、大文字・小文字のアルファベット、数字、ハイフン、アンダースコア、ピリオド、チルダです。これ以外は普遍的に安全ではありません。

JavaScriptでの検証:

// これらの文字は encodeURIComponent を通してもそのまま:
encodeURIComponent("AZaz09-_.~") // "AZaz09-_.~"

// これらのよく使う文字はエンコードが必要:
encodeURIComponent(" ")   // "%20"
encodeURIComponent("!")   // "!"  (例外: encodeURIComponent は ! ~ * ' ( ) を保持)
encodeURIComponent("/")   // "%2F"
encodeURIComponent("@")   // "%40"

encodeURIComponent()の例外に関する注意: JavaScriptのencodeURIComponent()は未予約セットに加えて! ' ( ) *をエンコードしません。これらの文字はほとんどのコンテキストで安全ですが、RFC 3986では技術的には予約されたサブデリミタです。最も厳密な準拠(例:OAuth署名ベース文字列)には、これらも手動でエンコードする必要がある場合があります。

URL安全な文字列のための実用ガイドライン:

  • スラッグと識別子: 小文字アルファベット、数字、ハイフンのみを使用(例:my-blog-post
  • URL内のファイル名: スペースをハイフンに置換し、特殊文字を除去する
  • APIキーとトークン: URL安全なトークンにはBase64urlエンコード(A-Z、a-z、0-9、-、_)を使用する
  • クエリパラメータ値: 値が未予約文字のみで構成されていることが確実でない限り、常にエンコードする

特定の位置で安全な予約文字:

  • /はパスでは安全(区切りとして)だがパラメータ値ではエンコードが必要
  • ?はクエリ文字列区切りとしては安全だがパラメータ値ではエンコードが必要
  • #はフラグメント区切りとしては安全だがそれ以外のすべての場所でエンコードが必要
  • &=はクエリパラメータ区切りとしては安全だが値ではエンコードが必要

落とし穴: ブラウザのアドレスバーで正しく表示されるからといって、その文字が安全だと仮定しないでください。ブラウザは表示のために独自のエンコード・デコードを行います。真に安全な文字は上記の66個の未予約文字のみです。迷ったらエンコードしましょう。

ユースケース

Webページ、APIエンドポイントパス、リソース識別子のためのURL安全なスラッグ形式の設計。エンコードを一切必要としないフォーマットの構築。

Try It — URL Encoder

フルツールを開く