URLエンコーディング:知っておくべきすべてのこと

· 12分で読めます

目次

URLエンコーディングの理解

URLエンコーディングは、パーセントエンコーディングとも呼ばれ、インターネット上で信頼性の高いデータ転送を保証するための基本的なメカニズムです。これは、URLで許可されていない文字を、Webブラウザ、サーバー、その他のインターネットインフラストラクチャによって安全に送信および解釈できる形式に変換します。

その核心において、URLエンコーディングはシンプルな問題に対処します。URLには、ASCII文字セットからの限られた文字セットのみを含めることができます。このセット外の文字(特殊記号、スペース、非ラテン文字など)を含める必要がある場合、それらは普遍的に認識される形式にエンコードする必要があります。

エンコーディングプロセスは、問題のある文字をパーセント記号(%)とそれに続く文字のASCIIまたはUTF-8コードを表す2桁の16進数に置き換えます。これにより、URLのすべてのコンポーネントが、誤解釈やデータ損失なしに意図したとおりに正確に送信されることが保証されます。

クイックヒント: コードを書かずに任意のURL文字列を即座にエンコードまたはデコードするには、URLエンコーダー&デコーダーツールを使用してください。

URLエンコーディングが必要な理由

URLエンコーディングの必要性は、インターネットの元の設計上の制約と、RFC 3986で定義されたURL仕様に由来します。URLは、異なるシステム、プロトコル、地理的地域間での互換性を確保するために、限られた文字セットで動作するように設計されました。

URLエンコーディングがなければ、いくつかの重大な問題が発生します:

URL内の「cats & dogs」の検索クエリを考えてみましょう。エンコーディングがなければ、アンパサンドはパラメータ区切り文字として解釈され、クエリが2つの別々のパラメータに分割される可能性があります。URLエンコーディングは、これをcats%20%26%20dogsに変換し、意図した意味を保持します。

ASCIIの制限

URLはASCII文字セット上に構築されており、128文字のみが含まれます。これらのうち、「予約されていない文字」として知られるサブセットのみが、エンコーディングなしでURLに表示できます。これらの予約されていない文字には次のものが含まれます:

それ以外のすべては、インターネット全体で適切な送信と解釈を保証するためにエンコーディングが必要です。

URLエンコーディングの仕組み

URLエンコーディングプロセスは、文字をパーセントエンコードされた同等物に変換する簡単なアルゴリズムに従います。このプロセスを理解することで、エンコーディングの問題をトラブルシューティングし、より堅牢なWebアプリケーションを作成できます。

エンコーディングアルゴリズム

文字をエンコードする必要がある場合、プロセスは次のように機能します:

  1. 文字を識別する: URLコンポーネントとエンコーディングルールに基づいて、エンコードが必要な文字を決定します。
  2. バイト値を取得する: UTF-8エンコーディング(または基本文字の場合はASCII)を使用して、文字をバイト表現に変換します。
  3. 16進数に変換する: 各バイトを2桁の16進数として表現します。
  4. パーセントプレフィックスを追加する: 各16進数のペアの前にパーセント記号(%)を付けます。

たとえば、スペース文字のASCII値は32(10進数)または20(16進数)です。エンコードされると、%20になります。アットマーク(@)のASCII値は64(10進数)または40(16進数)なので、%40にエンコードされます。

UTF-8マルチバイトエンコーディング

ASCII範囲外の文字の場合、UTF-8エンコーディングは複数のバイトを生成し、それぞれがパーセントエンコードされます。絵文字「😀」(にっこり顔)は、UTF-8で4バイトとしてエンコードされます:F0 9F 98 80。URLでは、これは%F0%9F%98%80になります。

このマルチバイトエンコーディングにより、あらゆる言語またはシンボルセットの文字をURLで安全に送信できるようになり、Webが真に国際的になります。

プロのヒント: URLエンコーディングの問題をデバッグする場合は、ブラウザの開発者ツールを使用して、送信される実際のエンコードされたURLを検査します。ネットワークタブには、生のエンコードされたリクエストが表示され、エンコーディングの問題を明らかにすることができます。

エンコードが必要な文字

すべての文字がすべてのコンテキストでエンコーディングを必要とするわけではありませんが、どの文字がいつエンコーディングを必要とするかを理解することは、信頼性の高いWebアプリケーションを構築するために不可欠です。エンコーディング要件は、作業しているURLの部分によって異なります。

予約文字

予約文字はURL構文で特別な意味を持ち、区切り文字ではなくデータとして使用される場合はエンコードする必要があります。これらの文字には次のものが含まれます:

文字 URLでの目的 エンコード形式
: スキームとホストの区切り、ポート区切り文字 %3A
/ パスセグメント区切り文字 %2F
? クエリ文字列の開始をマーク %3F
# フラグメント識別子の開始をマーク %23
[ ] IPv6アドレス区切り文字 %5B %5D
@ 認証情報とホストの区切り %40
! $ & ' ( ) * + , ; = さまざまな目的のサブ区切り文字 %21 %24 %26 %27 %28 %29 %2A %2B %2C %3B %3D

安全でない文字

特定の文字は、送信中に変更または誤解釈される可能性があるため、安全でないと見なされます。これらは常にエンコーディングが必要です:

文字 安全でない理由 エンコード形式
スペース 削除されるか、+に変換される可能性があります %20
" HTMLでURLを区切るために使用されます %22
< > HTMLタグで使用され、フィルタリングされる可能性があります %3C %3E
% エンコーディング区切り文字自体 %25
\ 一部のシステムでのパス区切り文字 %5C
^ ` { } | 普遍的にサポートされていません %5E %60 %7B %7D %7C

コンテキスト依存のエンコーディング

エンコーディング要件は、作業しているURLコンポーネントによって異なります。あるコンテキストで安全な文字が、別のコンテキストではエンコーディングを必要とする場合があります:

URLエンコーディングの一般的な使用例

URLエンコーディングは、多数の実際のシナリオで表示されます。これらの使用例を理解することで、独自のプロジェクトでエンコーディングをいつどのように適用するかを認識できます。

検索クエリ

検索エンジンは、ユーザークエリを処理するためにURLエンコーディングに大きく依存しています。Googleで「how to bake a cake?」を検索すると、URLは次のようになります:

https://www.google.com/search?q=how+to+bake+a+cake%3F

スペースがプラス記号(クエリ文字列内のスペースの代替エンコーディング)としてエンコードされ、疑問符が%3Fとしてエンコードされて、クエリ文字列区切り文字と区別されることに注意してください。

フォーム送信

HTMLフォームがGETメソッドを使用して送信されると、フォームデータがエンコードされてURLに追加されます。ユーザー名とパスワードフィールドを持つログインフォームを考えてみましょう:

https://example.com/login?username=john.doe%40example.com&password=P%40ssw0rd%21

メールアドレスとパスワードの特殊文字が適切にエンコードされ、解釈の問題を防ぎます。

セキュリティ注意: パスワードなどの機密データをURLパラメータで送信しないでください。この例は説明のみを目的としています。認証には常にHTTPSでPOSTリクエストを使用してください。

APIリクエスト

RESTful APIには、エンコーディングが必要なパラメータがURLに含まれることがよくあります。結果をフィルタリングしたり、複雑なデータ構造を渡したりする場合、適切なエンコーディングにより、APIが意図したとおりに正確に受信されます:

https://api.example.com/users?filter=created_at>2024-01-01&sort=-name

フィルターパラメータの大なり記号は、HTMLエンティティやその他の解釈との混同を防ぐために、%3Eとしてエンコードする必要があります。

ファイルのダウンロード

非ASCII名のファイルを提供する場合、URLエンコーディングによりファイル名が正しく送信されます:

https://example.com/downloads/Pr%C3%A9sentation%202024.pdf

「Présentation」のアクセント付き「é」は%C3%A9(そのUTF-8表現)としてエンコードされ、システムの文字エンコーディングに関係なく、世界中のユーザーがファイルをダウンロードできるようになります。

ソーシャルメディア共有

ソーシャルメディアプラットフォームは、事前入力されたテキストでリンクを共有する際にURLエンコーディングを使用します。Twitter共有リンクは次のようになります:

https://twitter.com/intent/tweet?text=Check%20out%20this%20article%21&url=https%3A%2F%2Fexample.com%2Farticle

ツイートテキストと共有されるURLの両方がエンコードされ、

We use cookies for analytics. By continuing, you agree to our Privacy Policy.