首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP URL 編碼解碼全攻略:urlencode/rawurlencode 差異與中文處理實戰

     編輯:PHP 相關知識

核心函數對比表

函數空格處理編碼標準適用場景
urlencode()+ (加號)application/x-www-form-urlencoded表單提交、傳統 GB2312 頁面
rawurlencode()%20RFC 3986 (URI 標準)URL 路徑、現代 UTF-8 頁面、API 簽名
urldecode()解碼 + 為空格配對 urlencode解析表單數據、舊項目兼容
rawurldecode()解碼 %20 為空格配對 rawurlencode解析標準 URI、RESTful API 參數

編碼標準差異:GB2312 vs UTF-8

// 字符串「中文」
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 實戰代碼演示

<?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
?>

血淚教訓:空格導致的下載失效 Bug

早期項目用 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

延伸閱讀

  • JS 編碼函數 escape/encodeURI/encodeURIComponent 深度對比
  • PHP str_replace 速度優於 preg_replace
  • PHP range() 生成連續數字/字母數組與抽獎應用
  • PHP 字符串處理函數大全
  • PHP 從身份證提取生日並判斷未成年
  • PHP 數組查找值:in_array/array_search/array_key_exists
  • PHP memory_get_usage 監控內存優化性能
  • SMTP Error: Could not connect to SMTP host 解決
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved