url-encode url-decode percent-encoding developer-tools rfc3986

URLエンコード・デコード オンライン無料:パーセントエンコーディング完全ガイド

URLのエンコードとデコードをオンラインで無料で行えます。RFC 3986パーセントエンコーディング、予約文字、URL構造における一般的な問題について解説します。

URLエンコード・デコード オンライン無料:パーセントエンコーディング完全ガイド

URLエンコード(別名:パーセントエンコーディング)は、URI(Uniform Resource Identifier)内で情報をエンコードするための仕組みです。一見単純な技術的詳細に見えるかもしれませんが、これはWebが機能するための基本的な部分であり、ブラウザとサーバー間でデータが正しく送信されることを保証します。

このガイドでは、URLエンコードが必要な理由、その仕組みについて深く掘り下げ、便利なオンラインツールを紹介します。

なぜURLエンコードが必要なのか?

URL(Uniform Resource Locator)には、RFC 3986で定義された制限された文字セットがあります。これらには特定の文字しか含めることができません。このセットに含まれない文字(スペース、日本語などの非ASCII文字、または &= のようなURL内で特別な意味を持つ文字)を含める必要がある場合は、それらをエンコードする必要があります。

予約文字と非予約文字

仕様に従って、文字は2つのカテゴリに分類されます。

  1. 非予約文字 (Unreserved Characters): エンコードせずにURLで使用できる文字です。以下が含まれます:

    • 英大文字・小文字 (A-Z, a-z)
    • 数字 (0-9)
    • ハイフン (-)、アンダースコア (_)、ピリオド (.)、チルダ (~)
  2. 予約文字 (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エンコード・デコードツール を使えば、数秒で完了します!