Web 開發中亂碼問題核心在於三處編碼設置不一致:文件編碼、頁面聲明編碼、數據庫連接編碼。本文系統梳理常見場景與解決方案。
<meta http-equiv="Content-Type" content="text/html; charset=XXX"> 告訴瀏覽器解碼方式,中文站常用 GB2312/UTF-8。查詢前執行:
mysql_query("SET NAMES GBK"); // GBK 為 GB2312 超集
頁面為 UTF-8 時:
mysql_query("SET NAMES UTF8"); // 注意:MySQL 中寫 UTF8 而非 UTF-8
若頁面編碼與數據庫內部編碼一致,可省略此步驟。
深層原理:
SET NAMES實際設置character_set_client,告知服務器客戶端發送數據的編碼,而非使用 my.ini 中的默認值([client] default-character-set、[mysqld] default-character-set)。
少見於開發階段(DW 會顯示亂碼),多發於:
現象: 頁面聲明 GB2312,IE 仍識別為 UTF-8,手動切換後正常。
原因: Apache httpd.conf 設置 AddDefaultCharset UTF-8,HTTP Header 優先級高於 Meta 標籤。
解決:
AddDefaultCharset GB2312.htaccess 添加 AddDefaultCharset GB2312SET NAMES UTF8header("Content-Type: text/html; charset=UTF-8");