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

PHP GET 取得 URL 中文參數亂碼解決方案:urlencode / urldecode 完整教學

     編輯:PHP 相關知識

前言

GET 表單或連結傳遞中文參數時,若未編碼直接放入 URL,伺服器接收後常出現亂碼(尤其 Apache + PHP 預設 ISO-8859-1 解碼)。本文說明 **`urlencode` / `urldecode`** 標準流程、`rawurlencode` 差異、JavaScript 配合、`http_build_query` 批次處理與現代框架自動處理機制。

問題重現

<a href="list.php?plate=轄區動態">查看</a>
// 瀏覽器實際請求(視編碼而定):
// list.php?plate=%E8%BD%84%E5%8D%80%E5%8B%95%E6%80%81 (UTF-8)
// 或 list.php?plate=%B5%A5%B3%F6%B6%AF%B2%BB (Big5)

// PHP 接收 $_GET['plate'] 可能得到亂碼或截斷

標準解決方案:urlencode + urldecode

發送端(產生連結)

<?php
$plate = '轄區動態';
$encoded = urlencode($plate); // 轉為 %E8%BD%84%E5%8D%80%E5%8B%95%E6%80%81
echo "<a href='list.php?plate=$encoded'>查看</a>";

接收端(list.php)

<?php
$plate = urldecode($_GET['plate'] ?? '');
echo $plate; // 正確顯示:轄區動態

關鍵函式差異

函式空白編碼符合標準適用場景
urlencode`+` (加號)application/x-www-form-urlencoded**表單 POST/GET 參數、舊系統相容**
rawurlencode`%20`RFC 3986 (URI 標準)**URL 路徑片段、現代 API、OAuth 簽名**
urldecode解 `+` 為空白配對 urlencode接收表單參數
rawurldecode不解 `+`配對 rawurlencode解析 URL 路徑、Header

**建議**:**參數值一律用 `rawurlencode` / `rawurldecode`**(符合 URI 標準),除非對接舊系統要求 `+` 代表空白。

JavaScript 端編碼(AJAX/動態連結)

// 正確:encodeURIComponent (RFC 3986,對應 PHP rawurlencode)
const param = encodeURIComponent('轄區動態'); // "%E8%BD%84%E5%8D%80%E5%8B%95%E6%80%81"
fetch(`list.php?plate=${param}`)

// 錯誤:escape() (已棄用)、encodeURI() (不編碼 & = ? 等保留字元)

批次產生查詢字串:http_build_query

$params = [
    'plate' => '轄區動態',
    'page'  => 2,
    'sort'  => 'desc',
];
// 預設使用 PHP_QUERY_RFC3986 (rawurlencode) - PHP 5.4+
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
echo "list.php?$query";
// list.php?plate=%E8%BD%84%E5%8D%80%E5%8B%95%E6%80%81&page=2&sort=desc

編碼一致性鐵律

  1. **專案統一 UTF-8**:資料庫、PHP、HTML、JS、URL 皆為 UTF-8。
  2. **發送端 `rawurlencode` / `encodeURIComponent`** → **接收端 `rawurldecode` / `decodeURIComponent`**。
  3. **不要手動 `urldecode($_GET[...])`**:PHP 自動對 `$_GET`/`$_REQUEST` 做 `urldecode`(視 `arg_separator.input` 設定)。若雙重解碼會導致 `+` 變空白、已編碼字元二次解碼錯誤。
  4. **Apache `AllowEncodedSlashes On`** 若 URL 參數含 `/` 需傳遞。

現代框架自動處理

  • **Laravel**:`request()->input('plate')` 自動處理編碼解碼,底層用 `urldecode`。
  • **Symfony**:`$request->query->get('plate')` 同理。
  • **原生 PHP**:直接用 `$_GET['plate']` 即可(已自動 `urldecode`),**無需手動呼叫**。

除錯檢查清單

  1. 瀏覽器 Network 面板查看實際 Request URL 參數是否為 `%XX%XX` 格式。
  2. PHP `var_dump($_GET)` 確認接收值。
  3. 檢查 `mb_internal_encoding()`、`default_charset` 是否為 UTF-8。
  4. 檢查資料庫連線 `SET NAMES utf8mb4`。
  5. 若仍亂碼,嘗試 `iconv('ISO-8859-1', 'UTF-8', $_GET['param'])` 強制轉碼(舊系統遺留問題)。

總結

GET 中文參數亂碼核心在於**「編碼/解碼雙方不一致」**。標準流程:**發送端 `rawurlencode` (JS `encodeURIComponent`) → 接收端 PHP 自動 `urldecode`(直接用 `$_GET`)**。專案統一 UTF-8、棄用手動 `urldecode`、善用 `http_build_query` 批次產生查詢字串,即可徹底消除亂碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved