PHP 開發中最常見的問題之一就是網頁顯示亂碼,無論是直接輸出的 HTML 內容,還是 JavaScript alert() 彈出的訊息框,只要瀏覽器解碼方式與伺服器實際編碼不一致,就會出現亂碼。雖然使用者可手動切換瀏覽器編碼,但這嚴重損害使用者體驗,也非專業開發應有的態度。
HTTP 回應缺少正確的 Content-Type 標頭,導致瀏覽器無法得知正確編碼,只能猜測或使用預設編碼(如 Big5、GB2312),與實際 UTF-8 內容不符而產生亂碼。
在 PHP 檔案的最開頭(任何輸出之前)加入以下標頭宣告:
<?php
header("Content-type: text/html; charset=UTF-8");
// 後續業務邏輯...
?>
echo、HTML 空白、BOM 簽名都會導致標頭發送失敗charset=Big5;現代專案建議統一 UTF-8| 層面 | 建議設定 | 檢查方式 |
|---|---|---|
| PHP 輸出標頭 | header("Content-Type: text/html; charset=UTF-8") | 瀏覽器開發工具 Network → Response Headers |
| HTML meta 標籤 | <meta charset="UTF-8"> (HTML5) | View Page Source 檢視原始碼 |
| 資料庫連線 | PDO: charset=utf8mb4 / mysqli: set_charset('utf8mb4') | 執行 SHOW VARIABLES LIKE 'character_set%' |
| 資料表/欄位 | CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | SHOW CREATE TABLE table_name |
| PHP 檔案編碼 | UTF-8 無 BOM | 編輯器右下角或「另存新檔」編碼選項 |
| Web 伺服器 | Nginx: charset utf-8; / Apache: AddDefaultCharset UTF-8 | curl -I 檢查回應標頭 |
utf8 而非 utf8mb4:MySQL 的 utf8 只支援 3 位元組字元,無法儲存 Emoji 等 4 位元組字元,必須用 utf8mb4header() 失效或 JSON 解析錯誤<?php
// 快速檢查目前輸出編碼
header("Content-Type: text/plain; charset=UTF-8");
echo "當前輸出編碼測試:中文測試";
// 若瀏覽器正常顯示中文,說明 header 生效
?>
解決 PHP 亂碼的核心在於「統一編碼」:PHP header()、HTML <meta charset>、資料庫連線、檔案儲存、Web 伺服器設定,五個環節全部設為 UTF-8(推薦 utf8mb4)。養成在每個 PHP 入口檔案開頭寫入 header 的習慣,能從根源杜絕 90% 的亂碼問題。