在 PHP 開發中,rawurlencode() 與 urlencode() 皆用於 URL 編碼,但兩者處理空白字元的方式不同,導致實際應用時常產生不一致問題。本文深入解析兩者差異並提供選擇建議。
| 函數 | 遵循標準 | 空白編碼 | 適用場景 |
|---|---|---|---|
rawurlencode() | RFC 3986 (取代 RFC 1738) | %20 | URL 路徑、查詢參數值、API 請求 |
urlencode() | application/x-www-form-urlencoded (表單提交標準) | + | POST 表單資料、傳統查詢字串 |
$url = 'https://example.com/PHP 編碼區別+';
// rawurlencode 輸出
http%3A%2F%2Fexample.com%2FPHP%20%E7%B7%A8%E7%A2%BC%E5%8D%80%E5%88%A5%2B
// urlencode 輸出
http%3A%2F%2Fexample.com%2FPHP+E7%B7%A8%E7%A2%BC%E5%8D%80%E5%88%A5%2B
差異在於空白:rawurlencode 編為 %20,urlencode 編為 +。加號(+)本身會被 rawurlencode 編為 %2B,而 urlencode 保持為 +。
rawurldecode() — 解碼 rawurlencode() 編碼的字串urldecode() — 解碼 urlencode() 編碼的字串(會將 + 還原為空白)rawurlencode():符合現代 RFC 3986 標準,避免跨平台、跨語言整合時的編碼不一致。application/x-www-form-urlencoded,伺服端以 $_POST 接收已自動解碼,無需手動處理。encodeURIComponent()(對應 rawurlencode),而非 escape() 或 encodeURI()。%2520 等異常。urldecode() 解碼 rawurlencode() 結果,空白無法正確還原。