URLエンコード・デコード オンライン無料:パーセントエンコーディング完全ガイド
URLエンコード(別名:パーセントエンコーディング)は、URI(Uniform Resource Identifier)内で情報をエンコードするための仕組みです。一見単純な技術的詳細に見えるかもしれませんが、これはWebが機能するための基本的な部分であり、ブラウザとサーバー間でデータが正しく送信されることを保証します。
このガイドでは、URLエンコードが必要な理由、その仕組みについて深く掘り下げ、便利なオンラインツールを紹介します。
なぜURLエンコードが必要なのか?
URL(Uniform Resource Locator)には、RFC 3986で定義された制限された文字セットがあります。これらには特定の文字しか含めることができません。このセットに含まれない文字(スペース、日本語などの非ASCII文字、または & や = のようなURL内で特別な意味を持つ文字)を含める必要がある場合は、それらをエンコードする必要があります。
予約文字と非予約文字
仕様に従って、文字は2つのカテゴリに分類されます。
非予約文字 (Unreserved Characters): エンコードせずにURLで使用できる文字です。以下が含まれます:
- 英大文字・小文字 (A-Z, a-z)
- 数字 (0-9)
- ハイフン (
-)、アンダースコア (_)、ピリオド (.)、チルダ (~)
予約文字 (Reserved Characters): URL内で特別な意味を持つ文字です(例:
/,?,#,&,=などの区切り文字)。これらの文字が区切り文字としてではなく、送信されるデータ(検索クエリなど)の一部である場合は、エンコードする必要があります。
パーセントエンコーディングの仕組み
パーセントエンコーディングは、予約文字を % とその文字のASCII値の2桁の16進数表現に置き換えます。
例:
- スペース は
%20になります(ASCII値 32, 16進数 20)。 - 感嘆符 (!) は
%21になります(ASCII値 33, 16進数 21)。 - アンパサンド (&) は
%26になります(ASCII値 38, 16進数 26)。
主なエンコード文字一覧
| 文字 | エンコード後の値 | 説明 |
|---|---|---|
| スペース | %20 または + |
URLの場所によって異なります |
! |
%21 |
感嘆符 |
# |
%23 |
ハッシュ(フラグメント識別子) |
$ |
%24 |
ドル記号 |
& |
%26 |
アンパサンド(クエリ区切り文字) |
' |
%27 |
シングルクォート |
( |
%28 |
左括弧 |
) |
%29 |
右括弧 |
* |
%2A |
アスタリスク |
+ |
%2B |
プラス記号 |
, |
%2C |
カンマ |
/ |
%2F |
スラッシュ(パス区切り文字) |
: |
%3A |
コロン |
; |
%3B |
セミコロン |
= |
%3D |
等号(クエリパラメータ) |
? |
%3F |
疑問符(クエリ開始) |
@ |
%40 |
アットマーク |
スペースの扱い:%20 vs. +
スペースが %20 とエンコードされる場合と + とされる場合があることに気づいたかもしれません。
%20は、URIのどの部分でも使用できる標準的なスペースのエンコードです。+は、URLのクエリ文字列部分(?以降)でのみスペースに使用されます。これは、HTMLフォームで使用される古いapplication/x-www-form-urlencoded形式に由来します。
現代のツールやライブラリは通常これを自動的に処理しますが、開発者にとって混乱の原因となることが多いポイントです。
プログラミングにおけるURLエンコード
ほとんどのプログラミング言語には、URLエンコードとデコードのための組み込み関数が用意されています。
JavaScript
// URIコンポーネントのエンコード
const query = "hello world & friends";
const encoded = encodeURIComponent(query);
console.log(encoded); // 出力: hello%20world%20%26%20friends
// デコード
const decoded = decodeURIComponent(encoded);
console.log(decoded); // 出力: hello world & friends
Python
import urllib.parse
query = "hello world & friends"
encoded = urllib.parse.quote(query)
print(encoded) # 出力: hello%20world%20%26%20friends
decoded = urllib.parse.unquote(encoded)
print(decoded) # 出力: hello world & friends
PHP
<?php
$query = "hello world & friends";
$encoded = urlencode($query);
echo $encoded; // 出力: hello+world+%26+friends
$decoded = urldecode($encoded);
echo $decoded; // 出力: hello world & friends
?>
よくある質問 (FAQ)
1. URL全体をエンコードすべきですか、それとも一部だけですか?
通常、クエリパラメータの値やパスの特定のセグメントのみをエンコードする必要があります。URL全体(http:// や :、/ などの区切り文字を含む)をエンコードすると、URIとして無効になります。値には encodeURIComponent() を、URI全体には encodeURI() を使用してください(区切り文字はスキップされます)。
2. URLエンコードはBase64エンコードと同じですか?
いいえ、異なります。URLエンコード(パーセントエンコーディング)はURL内の文字をエスケープするために使用されます。Base64はバイナリデータを64個のASCII文字の文字列として表現するために使用されます。これらは全く異なる目的で使用されます。
3. 「Malformed URI」エラーが出るのはなぜですか?
これは通常、デコード中に文字列に % 文字が含まれているが、その後に有効な2桁の16進数が続いていない場合に発生します。例えば、index.php?name=100% は、末尾の % がエンコードシーケンスの有効な開始ではないため、エラーになります。
4. URLエンコードはUnicodeをサポートしていますか?
はい、サポートしています。現代のURLエンコード(UTF-8ベース)は、文字をまずUTF-8バイトシーケンスに変換し、各バイトをパーセントエンコードすることでUnicodeを処理します。例えば、「漢」という文字(UTF-8: E6 B1 89)は %E6%B1%89 になります。
結論
URLエンコードは、Webデータの整合性を確保するためのシンプルかつ不可欠なツールです。Webアプリケーションの構築、API呼び出しのデバッグ、あるいは単にWebの仕組みに興味がある場合でも、パーセントエンコーディングを理解することは不可欠です。
文字列を素早くエンコードまたはデコードする必要がありますか?当サイトの URLエンコード・デコードツール を使えば、数秒で完了します!