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

PHP 與 MySQL UTF-8 中文亂碼終極解決方案總結

     編輯:PHP 綜合知識

亂碼根因分析

中文亂碼本質是 編碼不一致:瀏覽器、HTML 頁面、PHP 文件、MySQL 連線、資料表欄位、資料庫預設編碼——任一環節不匹配即會產生亂碼。

一、HTML/PHP 頁面層面

層面正確做法常見錯誤
HTTP Headerheader("Content-Type: text/html; charset=utf-8"); 放在 所有輸出之前有空白行、BOM、echo 在 header 前
HTML Meta<meta charset="utf-8"> 放在 <head> 首行放在 title 後、或寫成 gb2312
文件編碼編輯器「另存為」選 UTF-8 無 BOMANSI、UTF-8 with BOM
BOM 移除DW/EditPlus/VS Code 另存為去除 BOMBOM 導致 session_start 失效

二、MySQL 資料庫層面

-- 1. 建庫指定編碼
CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 2. 建表指定欄位編碼
CREATE TABLE `test` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三、PHP 連線層面(關鍵)

<?php
$conn = mysql_connect($host, $user, $pass);
mysql_select_db($db, $conn);

// 必須在查詢前執行,順序不影響
mysql_query("SET NAMES 'utf8'");      // 讀/寫統一
// 或分開(舊版建議)
mysql_query("SET CHARACTER SET 'utf8'"); // 讀
mysql_query("SET NAMES 'utf8'");          // 寫
?>

四、PHP 附件下載中文檔名

<?php
$filename = "中文檔名.pdf";
// 頁面為 UTF-8,下載需轉 GB2312 否則 IE 亂碼
header("Content-Disposition: attachment; filename=" . iconv("UTF-8", "GB2312", $filename));
readfile($path);
?>

五、字串截取避免亂碼

function utf8_substr($str, $len) {
    $result = '';
    for ($i = 0; $i < $len; $i++) {
        $char = $str[$i] ?? '';
        if (!$char) break;
        if (ord($char) > 127) { // 多位元組字符
            $result .= $str[$i] . $str[$i+1] . $str[$i+2];
            $i += 2;
        } else {
            $result .= $char;
        }
    }
    return $result;
}
// 或直接用 mb_substr (需開啟 mbstring)
echo mb_substr($str, 0, 10, 'UTF-8');

六、常見環境一鍵檢查清單

  1. 資料庫/表/欄位 CHARSET=utf8 / COLLATE=utf8_general_ci
  2. PHP 文件儲存為 UTF-8 無 BOM
  3. 頁面輸出前 header("Content-Type: text/html; charset=utf-8")
  4. HTML <meta charset="utf-8">
  5. 連線後 mysql_query("SET NAMES 'utf8'")
  6. 若用 AppServ/XAMPP 等整合包,確認 my.ini default-character-set=utf8

總結:統一就是王道

「頁面編碼 = 資料庫連線編碼 = 資料表編碼 = 文件儲存編碼 = UTF-8」,只要這條鏈路全線一致,亂碼自然消失。

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