[PHP]rawurlencode関数の使い方を徹底解説!urlencode()との違いも紹介

PHP

はじめに

Web開発をしていると、URLにパラメータを渡す場面は数え切れないほどあります。しかし、日本語や特殊文字をそのままURLに含めると、文字化けやエラーの原因になってしまいます。

そんな時に役立つのが、PHPのrawurlencode関数です。この記事では、rawurlencode関数の基本から実践的な使い方まで、初心者の方にも分かりやすく解説していきます。

rawurlencode関数とは?

rawurlencode関数は、文字列をURLエンコード(パーセントエンコーディング)する関数です。具体的には、英数字とハイフン(-)、アンダースコア(_)、ドット(.)、チルダ(~)以外の文字を「%XX」形式に変換します。

基本的な使い方

<?php
$text = "こんにちは世界";
$encoded = rawurlencode($text);
echo $encoded;
// 出力: %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C
?>

とてもシンプルですね!文字列を引数に渡すだけで、URL安全な形式に変換してくれます。

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

URLには使用できる文字に制限があります。以下のような文字をそのまま使うと問題が発生します:

  • 日本語などのマルチバイト文字: そもそもURL仕様上、ASCII文字以外は直接使えません
  • スペース: URLの区切りと誤認される可能性があります
  • 特殊文字(#, ?, &, =など): URLの構造を定義する予約文字と衝突します

例えば、検索クエリに「PHP 入門」を含めたい場合:

<?php
// ❌ 悪い例:エンコードしない
$search = "PHP 入門";
$url = "https://example.com/search?q=" . $search;
// 結果: https://example.com/search?q=PHP 入門
// → スペースや日本語が問題を引き起こす可能性

// ✅ 良い例:エンコードする
$search = "PHP 入門";
$url = "https://example.com/search?q=" . rawurlencode($search);
// 結果: https://example.com/search?q=PHP%20%E5%85%A5%E9%96%80
?>

rawurlencode() vs urlencode() の違い

PHPには似た関数として**urlencode()**もあります。この2つの違いを理解することが重要です。

スペースの扱いが異なる

  • rawurlencode(): スペースを%20に変換
  • urlencode(): スペースを+に変換
<?php
$text = "Hello World";

echo rawurlencode($text);  // Hello%20World
echo urlencode($text);     // Hello+World
?>

どちらを使うべき?

**RFC 3986(URLの標準仕様)に準拠しているのはrawurlencode()**です。以下のように使い分けましょう:

用途推奨関数
URLのパス部分rawurlencode()
クエリパラメータ(一般的)rawurlencode()
フォームデータ(application/x-www-form-urlencoded)urlencode()

基本的にはrawurlencode()を使っておけば間違いありません。

実践的な使用例

1. 検索URLの生成

<?php
$keyword = "PHP プログラミング 2024";
$searchUrl = "https://example.com/search?q=" . rawurlencode($keyword);

echo $searchUrl;
// https://example.com/search?q=PHP%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%202024
?>

2. ファイルパスのエンコード

<?php
$filename = "レポート 2024年度.pdf";
$downloadUrl = "https://example.com/files/" . rawurlencode($filename);

echo $downloadUrl;
// https://example.com/files/%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%202024%E5%B9%B4%E5%BA%A6.pdf
?>

3. 複数パラメータの処理

<?php
$params = [
    'name' => '山田太郎',
    'email' => 'yamada@example.com',
    'message' => 'お問い合わせ内容です!'
];

$query = [];
foreach ($params as $key => $value) {
    $query[] = rawurlencode($key) . '=' . rawurlencode($value);
}

$url = "https://example.com/contact?" . implode('&', $query);
echo $url;
// https://example.com/contact?name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&email=yamada%40example.com&message=%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%86%85%E5%AE%B9%E3%81%A7%E3%81%99%21
?>

4. APIリクエストでの使用

<?php
$userId = "user@example.com";
$apiUrl = "https://api.example.com/users/" . rawurlencode($userId);

// cURLでAPIリクエスト
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?>

よくある間違いと注意点

❌ 二重エンコードに注意

<?php
$text = "こんにちは";
$encoded = rawurlencode($text);
$doubleEncoded = rawurlencode($encoded);  // これはNG!

echo $encoded;        // %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
echo $doubleEncoded;  // %25E3%2581%2593%25E3%2582%2593%25E3%2581%25AB%25E3%2581%25A1%25E3%2581%25AF
?>

既にエンコード済みの文字列を再度エンコードすると、正しくデコードできなくなります。

❌ URLスキームやドメインのエンコードは不要

<?php
// ❌ 悪い例
$url = rawurlencode("https://example.com") . "/page";

// ✅ 良い例
$url = "https://example.com/" . rawurlencode("ページ名");
?>

URLのスキーム(https://)やドメイン部分はエンコードする必要がありません。パスやクエリパラメータの値だけをエンコードしましょう。

デコードする方法

エンコードした文字列を元に戻すには**rawurldecode()**を使います:

<?php
$encoded = "%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF";
$decoded = rawurldecode($encoded);

echo $decoded;  // こんにちは
?>

ただし、PHPでは$_GET$_POSTで受け取った値は自動的にデコードされるため、通常は明示的にデコードする必要はありません。

パフォーマンスについて

rawurlencode関数は非常に高速な関数なので、通常の使用では性能を気にする必要はありません。ただし、大量の文字列を処理する場合は以下の点に注意:

<?php
// 大量のデータを処理する場合
$items = [...]; // 10,000件のアイテム

// 都度エンコードするよりキャッシュする方が効率的
$encodedItems = array_map('rawurlencode', $items);
?>

まとめ

rawurlencode関数のポイントをおさらいしましょう:

  1. URLに安全な形式で文字列をエンコードする関数
  2. RFC 3986に準拠した標準的な方式
  3. スペースは%20に変換される(urlencode()は+に変換)
  4. 基本的にはrawurlencode()を使えばOK
  5. URLのパス部分やクエリパラメータの値に使用
  6. 二重エンコードに注意

URLを扱う際は、必ず適切にエンコードすることで、セキュリティやバグのリスクを減らすことができます。ぜひ日々の開発に活用してください!

参考リンク


この記事が役に立ったら、ぜひシェアしてください!PHPに関する他の記事もお楽しみに。

タイトルとURLをコピーしました