はじめに
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関数のポイントをおさらいしましょう:
- URLに安全な形式で文字列をエンコードする関数
- RFC 3986に準拠した標準的な方式
- スペースは%20に変換される(urlencode()は+に変換)
- 基本的にはrawurlencode()を使えばOK
- URLのパス部分やクエリパラメータの値に使用
- 二重エンコードに注意
URLを扱う際は、必ず適切にエンコードすることで、セキュリティやバグのリスクを減らすことができます。ぜひ日々の開発に活用してください!
参考リンク
この記事が役に立ったら、ぜひシェアしてください!PHPに関する他の記事もお楽しみに。
