| 函數 | 空格處理 | 編碼標準 | 適用場景 |
|---|---|---|---|
urlencode() | + (加號) | application/x-www-form-urlencoded | 表單提交、傳統 GB2312 頁面 |
rawurlencode() | %20 | RFC 3986 (URI 標準) | URL 路徑、現代 UTF-8 頁面、API 簽名 |
urldecode() | 解碼 + 為空格 | 配對 urlencode | 解析表單數據、舊項目兼容 |
rawurldecode() | 解碼 %20 為空格 | 配對 rawurlencode | 解析標準 URI、RESTful API 參數 |
// 字符串「中文」
GB2312: %D6%D0%CE%C4
UTF-8: %E4%B8%AD%E6%96%87
瀏覽器地址欄自動編碼遵循 頁面編碼:GB2312 頁面用 GB2312 編碼,UTF-8 頁面用 UTF-8 編碼。Firefox 早期版本對 GB2312 URL 支持較差(默認按 UTF-8 發送),FTP 協議除外。
<?php
// 默認按腳本文件編碼編碼(此處假設腳本為 GB2312)
echo urlencode("中文-_. "); // %D6%D0%CE%C4-_.+
echo urldecode("%D6%D0%CE%C4-_. "); // 中文-_.
echo rawurlencode("中文-_. "); // %D6%D0%CE%C4-_.%20
echo rawurldecode("%D6%D0%CE%C4-_. "); // 中文-_.
/* 關鍵差異:空格
urlencode → +
rawurlencode → %20
*/
// 強制 UTF-8 編碼(兩種方法)
$url = 'https://www.phpernote.com/中文.rar';
// 方法一:腳本存為 UTF-8,直接用
// 方法二:運行時轉碼
echo urlencode(mb_convert_encoding($url, 'utf-8', 'gb2312'));
// http%3A%2F%2Fwww.phpernote.com%2F%E4%B8%AD%E6%96%87.rar
?>
早期項目用
urlencode生成下載鏈接,文件名含空格編碼為+,導致 Nginx/Apache 解析路徑時識別失敗,文件無法下載。改用rawurlencode()(空格→%20)徹底解決。
function parseUrl($url = '') {
// 全量 UTF-8 編碼
$url = rawurlencode(mb_convert_encoding($url, 'gb2312', 'utf-8'));
// 還原保留字符
$search = ['%3A', '%2F', '%40']; // : / @
$replace = [':', '/', '@'];
return str_replace($search, $replace, $url);
}
// 測試
$url = "ftp://yongfu:password@www.huikaiche.com/中文/中文.rar";
echo parseUrl($url);
// ftp://yongfu:password@www.huikaiche.com/%D6%D0%CE%C4/%D6%D0%CE%C4.rar