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

徹底解決 PHP 中文亂碼:從字符集原理到 Nginx/Apache/PHP/資料庫全鏈路配置指南

     編輯:PHP 相關知識

中文亂碼本質是編碼與解碼不一致。各國制定字符集(ASCII、GB2312、JIS),早期本地化版本導致交換困難,Unicode 統一碼位解決此問題。現代軟體核心以 Unicode 運作,I/O 時按 Locale 轉換。Web 環境下,瀏覽器、Web Server、PHP、資料庫四端編碼必須**完全一致**。

資料庫編碼關鍵設定

  • 建庫/建表指定 CHARSET=utf8mb4(支援 Emoji),COLLATE=utf8mb4_unicode_ci。
  • PHP 連線後**第一條 SQL** 必須執行:SET NAMES utf8mb4(或對應頁面編碼)。告知 MySQL:客戶端發送/接收均用此編碼。
  • 避免用 latin1 (ISO-8859-1) 存中文:需手動拆分雙位元組,極易出錯且廢棄資料庫原生支援。

定位亂碼的「核彈級」技巧

在懷疑點輸出字串**內碼十六進制**:

echo bin2hex($str); // 或 var_dump(unpack('H*', $str));

觀察:何時變 Unicode、何時被截斷、何時變問號、何時高位元丟失。測試樣本建議用 aa啊aa?@aa(中英混雜、含 GB/GBK 特徵字),英文段永遠不變可作基準。

四層編碼宣告優先級(由高到低)

  1. PHP header():header('Content-Type: text/html; charset=utf-8'); 發送 HTTP 標頭,**瀏覽器無條件服從**,最可靠。
  2. Apache AddDefaultCharset:httpd.conf 中 AddDefaultCharset utf-8 等同給每檔加 header。註解掉可讓 meta 生效。
  3. HTML <meta charset="utf-8">:屬 HTML 內容,優先級較低,若前兩者存在則被忽略。
  4. PHP php.ini default_charset:建議註解關閉,讓瀏覽器依網頁標頭自動選擇,支援同站多語系。

實務檢查清單

  • ☐ 資料庫/表/欄位 utf8mb4
  • ☐ 連線後 SET NAMES utf8mb4
  • ☐ PHP 檔案儲存為 UTF-8 無 BOM
  • ☐ header('Content-Type: text/html; charset=utf-8'); 在**任何輸出前**呼叫
  • ☐ Apache/Nginx 未強制衝突編碼
  • ☐ 表單頁 `
    `
  • ☐ `htmlspecialchars($str, ENT_QUOTES, 'UTF-8')` 指定編碼

字符集知識是解碼亂碼的地圖,按圖索驄,亂碼無處遁形。

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