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

PHP 網頁編碼宣告全攻略:header()、meta、Apache 設定與資料庫編碼一致性

     編輯:PHP 綜合知識

一、HTTP 標頭 vs HTML Meta:優先級與生效機制

1. header() - 最高優先級

<?php
// 必須在任何輸出前呼叫
header('Content-Type: text/html; charset=utf-8');  // UTF-8
header('Content-Type: text/html; charset=gb2312'); // GBK/GB2312
header('Content-Type: text/html; charset=big5');   // Big5
?>
  • 屬於 HTTP 回應標頭,瀏覽器接收 HTML 內容前先讀取。
  • 絕對生效,瀏覽器會無條件遵循,覆蓋任何 meta 標籤。
  • 僅限 PHP 檔案使用。

2. <meta> 標籤 - 次要

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • 屬於 HTML 內容一部分,瀏覽器解析到時才生效。
  • 若 HTTP 標頭已指定編碼,meta 會被忽略。
  • 純 HTML 檔案唯一宣告方式。

3. Apache AddDefaultCharset - 伺服器層級預設

# httpd.conf
AddDefaultCharset UTF-8
  • 等同於為每個回應自動加上 header('Content-Type: ...; charset=UTF-8')。
  • 優先級:header() > AddDefaultCharset > <meta>。
  • 建議註解掉 AddDefaultCharset,由應用程式明確控制編碼,提高可移植性。

二、資料庫連線編碼:SET NAMES

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo->exec("SET NAMES 'utf8'");  // 或 utf8mb4

// mysqli
$mysqli->set_charset('utf8');
  • 告訴 MySQL:客戶端送出的 SQL 字串編碼、以及結果集回傳編碼。
  • 必須在執行任何查詢之前呼叫。
  • 現代專案建議使用 utf8mb4 完整支援 Emoji 與補充字元。

三、三層編碼一致性原則

層級設定位置範例值
資料庫/資料表/欄位 建立時指定 CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci utf8mb4
HTML 頁面輸出 PHP header() 或 <meta> utf-8
PHP/HTML 檔案儲存編碼 編輯器「另存新檔」編碼選項 UTF-8 (無 BOM)

三者必須完全一致,否則會產生亂碼。

四、特殊情境處理

JavaScript / Flash 傳入資料

前端通常以 UTF-8 傳送。若後端為 GBK,需轉碼:

$content = iconv('UTF-8', 'GBK//IGNORE', $_POST['content']);
// 或使用 mb_convert_encoding()
$content = mb_convert_encoding($_POST['content'], 'GBK', 'UTF-8');

PHP 來源檔編碼宣告 (僅供參考)

<?php
declare(encoding='UTF-8'); // PHP 5.3+,影響編譯器解讀字串字面值
?>

五、快速檢查清單

  1. 資料庫建立指定 utf8mb4?
  2. 連線執行 SET NAMES utf8mb4?
  3. PHP 檔案以 UTF-8 無 BOM 儲存?
  4. 每個 PHP 頁面頂端呼叫 header('Content-Type: text/html; charset=utf-8')?
  5. HTML 模板保留 <meta charset="utf-8"> 作為備援?
  6. Apache AddDefaultCharset 已註解?
  7. 前端 AJAX/表單傳輸編碼一致?

遵循上述步驟,可徹底杜絕編碼亂碼問題。

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