資料庫、資料表、欄位、PHP 檔案、HTML 頁面、MySQL 連線、HTTP Header —— 每一環都必須是 UTF-8,缺一不可。
| 層級 | 設定項目 | 正確值 |
|---|---|---|
| 資料庫 | 建庫/建表/欄位 Collation | utf8mb4_general_ci(支援 emoji) |
| PHP 連線 | PDO DSN | mysql:host=localhost;dbname=test;charset=utf8mb4 |
| PHP 連線 | mysqli | $mysqli->set_charset('utf8mb4') |
| PHP 檔案 | 編輯器儲存編碼 | UTF-8 without BOM |
| HTML 頁面 | <meta charset="UTF-8"> | 放在 <head> 最前面 |
| HTTP 回應 | Header | header('Content-Type: text/html; charset=UTF-8') |
| 表單 | <form accept-charset="UTF-8"> | 強制瀏覽器以 UTF-8 送出 |
// 錯誤
mysql_query("SET NAMES GB2312");
// 正確
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass');
使用 VS Code、PhpStorm、Notepad++ 另存為 UTF-8 (without BOM)。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <!-- 必須在 title 之前 -->
<title>...</title>
</head>
UTF-8 with BOM 會導致 header() 失效、輸出異常。務必移除 BOM。
var_dump($_POST); 觀察原始資料。SELECT HEX(column) FROM table;亂碼本質是編碼不一致。建立「全站 UTF-8」規範,並用檢查清單逐項驗證,即能徹底解決 POST 亂碼問題。