網址傳遞參數時,特殊字元(空格、中文、符號)必須編碼,否則會導致伺服器解析錯誤。PHP 提供兩組函數處理 URL 編碼,差異在於空格與波浪號的處理方式。
| 函數 | 空格編碼 | 波浪號 ~ | 適用場景 |
|---|---|---|---|
urlencode() | + | 編碼為 %7E | 表單 POST 資料、application/x-www-form-urlencoded |
urldecode() | 解碼 + 為空格 | 解碼 %7E | 配合 urlencode |
rawurlencode() | %20 | 不編碼(保留) | URL 路徑、查詢字串、HTTP 標頭(RFC 3986) |
rawurldecode() | 解碼 %20 | 保留 ~ | 配合 rawurlencode |
<?php
$url = 'https://example.com/search?q=PHP 教學&sort=desc';
// 1. 完整 URL 編碼(不建議,會編碼 : / ? = & 等結構字元)
echo urlencode($url) . "\n";
// https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DPHP+%E6%95%99%E5%AD%B8%26sort%3Ddesc
// 2. 僅編碼查詢參數值(正確做法)
$query = http_build_query([
'q' => 'PHP 教學',
'sort' => 'desc'
]);
echo "https://example.com/search?{$query}\n";
// https://example.com/search?q=PHP+%E6%95%99%E5%AD%B8&sort=desc
// 3. 解碼
$encoded = 'q=PHP+%E6%95%99%E5%AD%B8&sort=desc';
parse_str($encoded, $params);
print_r($params);
// Array ( [q] => PHP 教學 [sort] => desc )
?>
http_build_query(),自動處理編碼與陣列巢狀結構。parse_str() 或 parse_url() 取得 query 再解析。encodeURIComponent()(等同 rawurlencode)與 decodeURIComponent()。