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

PHP 編碼設定完整指南:header、meta、iconv 轉碼與 BUG 避坑

     編輯:PHP 綜合知識

PHP 字元編碼設定最佳實踐

編碼不一致會導致亂碼、資料截斷、資料庫存入錯誤。本文整理 PHP、HTML、資料庫、檔案編碼的統一設定與常見坑點。

一、PHP 輸出編碼設定

<?php
// 必須在任何輸出前呼叫
header('Content-Type: text/html; charset=utf-8'); // 推薦 UTF-8
// 或 GB2312
// header('Content-Type: text/html; charset=gb2312');
?>

二、HTML 頁面宣告編碼

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- HTML5 簡寫 -->
<meta charset="utf-8">

三、檔案儲存編碼一致性

  • 所有 PHP、HTML、JS、CSS 檔案統一儲存為 UTF-8 無 BOM 格式。
  • IDE 設定:VS Code、PhpStorm、Sublime 預設編碼 UTF-8。
  • 避免使用 ANSI/GB2312 儲存檔案,易造成中文亂碼。

四、資料庫連線編碼

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

// mysqli
$mysqli->set_charset('utf8mb4');
?>

資料表欄位建議用 utf8mb4_unicode_ci,支援 Emoji 與生僻字。

五、iconv 轉碼常見 BUG 與解決

將 UTF-8 轉 GB2312 時,遇到「—」(EM DASH U+2014)等字元會導致後續字串消失。

<?php
// 錯誤寫法:遇到無法轉換字元會截斷
$gb = iconv('UTF-8', 'GB2312', $utf8);

// 正確寫法:加上 //IGNORE 忽略無法轉換字元,或 //TRANSLIT 嘗試近似替換
$gb = iconv('UTF-8', 'GB2312//IGNORE', $utf8);   // 直接刪除問題字元
$gb = iconv('UTF-8', 'GB2312//TRANSLIT', $utf8); // 嘗試轉換為相近字元(如 — → --)
?>

六、mbstring 內部編碼設定

<?php
mb_internal_encoding('UTF-8');        // 內部處理編碼
mb_http_output('UTF-8');              // 輸出編碼
mb_regex_encoding('UTF-8');           // 正則編碼
// 或在 php.ini 設定
// mbstring.internal_encoding = UTF-8
// mbstring.http_output = UTF-8
?>

七、常見亂碼場景快速診斷表

現象可能原因檢查重點
頁面顯示 菱形問號瀏覽器解碼錯誤HTTP Header charset、meta charset、檔案實際編碼
中文變成 ??? 或 亂碼資料庫連線編碼不匹配PDO SET NAMES、mysqli set_charset、表欄位 collation
iconv 轉碼後字串變短目標編碼無對應字元加 //IGNORE 或 //TRANSLIT
JSON 輸出中文變 \uXXXXjson_encode 預設編碼加 JSON_UNESCAPED_UNICODE 參數

統一全站 UTF-8(含資料庫 utf8mb4)是現代 PHP 專案的標準配置,能避免 99% 的編碼問題。

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