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

PHP 解決網頁亂碼完整指南:編碼優先順序與最佳實務

     編輯:PHP 相關知識

亂碼產生的根本原因

網頁亂碼本質上是「編碼宣告與實際內容編碼不一致」導致瀏覽器以錯誤字元集解析。解決關鍵在於統一:檔案儲存編碼、HTTP Header、HTML Meta 標籤、資料庫連線編碼四者一致。

四種編碼宣告方式與優先順序

  1. PHP header() 函數(最高優先權)
    header("Content-Type: text/html; charset=utf-8");
    發送於 HTTP Header,瀏覽器最優先遵循,不可被覆蓋。
  2. Apache AddDefaultCharset
    AddDefaultCharset utf-8 於 httpd.conf
    等同於為每個檔案自動加上 header(),優先權次於 PHP header()。
  3. HTML Meta 標籤
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    屬於 HTML 內容一部分,優先權最低,僅在前兩者未設定時生效。
  4. php.ini default_charset
    default_charset = "utf-8"
    建議註解掉此行,避免強制指定導致多語系共存困難。

實務最佳實踐

1. 統一採用 UTF-8

現代 Web 開發建議全端採用 UTF-8(資料庫用 utf8mb4),避免 GB2312/Big5 相容性問題。

2. PHP 程式碼開頭強制輸出 Header

<?php
header("Content-Type: text/html; charset=utf-8");
// 其餘程式碼...
?>

3. 資料庫連線即設定編碼

$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
// 或 mysqli
mysqli_set_charset($link, "utf8mb4");
// 舊版 mysql_query("SET NAMES utf8mb4");

4. 檔案儲存編碼去除 BOM

使用 VS Code、Notepad++、EditPlus 等編輯器,儲存為「UTF-8 無 BOM」格式。BOM 會導致 header()、session_start()、setcookie() 失效(輸出前已有內容)。

5. Apache 設定補充

# httpd.conf
AddDefaultCharset Off
# 或明確指定
AddDefaultCharset utf-8

若為虛擬主機無法修改主設定,可於網站根目錄 .htaccess 加入:
AddDefaultCharset utf-8

常見問題快速排查

  • 「只有中文亂碼,英文正常」→ 編碼不一致
  • 「資料庫讀出亂碼」→ 連線未設 SET NAMES 或資料庫欄位編碼錯誤
  • 「表單送出亂碼」→ 頁面編碼與表單編碼不同,加上 accept-charset="utf-8"
  • 「Header 失效」→ 檢查是否有 BOM、空白行、include 檔案輸出內容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved