在 Ubuntu/Debian/CentOS 等 Linux 發行版上運行 PHP 應用時,網頁輸出中文顯示為 、□□□ 或亂碼,但英文數字正常。這通常發生在未涉及數據庫的純 PHP 輸出場景。
PHP 默認的 `default_charset` 為 `ISO-8859-1`(Latin-1),無法正確編碼中文字符。當瀏覽器接收到無 charset 聲明的響應時,會嘗試自動檢測或使用默認編碼,導致解碼錯誤。
# 定位配置文件 php --ini # 輸出示例: # Loaded Configuration File: /etc/php/8.2/fpm/php.ini # 編輯配置 sudo vim /etc/php/8.2/fpm/php.ini # 找到並修改 ; default_charset = "ISO-8859-1" default_charset = "UTF-8" # 重載 PHP-FPM sudo systemctl reload php8.2-fpm # 或 Apache 模式 sudo systemctl reload apache2
<?php
// 放在所有輸出之前(建議在入口文件最頂部)
header('Content-Type: text/html; charset=UTF-8');
// 或使用 ini_set(需在輸出前調用)
ini_set('default_charset', 'UTF-8');
?>
Nginx:
# 在 server 或 location 塊中 charset utf-8; # 或 add_header Content-Type "text/html; charset=utf-8";
Apache (.htaccess 或虛擬主機配置):
AddDefaultCharset UTF-8 # 或 AddCharset UTF-8 .php .html .htm
| 層級 | 檢查項目 | 正確值 |
|---|---|---|
| PHP | default_charset | UTF-8 |
| PHP | mbstring.internal_encoding | UTF-8 |
| PHP | mbstring.http_output | UTF-8 |
| 數據庫連接 | PDO::MYSQL_ATTR_INIT_COMMAND | SET NAMES utf8mb4 |
| HTML | <meta charset> | <meta charset="UTF-8"> |
| 文件編碼 | PHP 源文件 | UTF-8 無 BOM |
| 終端 | LANG/LC_ALL | zh_CN.UTF-8 |
<?php
// 診斷腳本:保存為 encoding_test.php 訪問
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP 版本: " . PHP_VERSION . "\n";
echo "default_charset: " . ini_get('default_charset') . "\n";
echo "mbstring.internal_encoding: " . ini_get('mbstring.internal_encoding') . "\n";
$test = "測試中文編碼";
echo "原始字符串: $test\n";
echo "字節長度: " . strlen($test) . "\n";
echo "字符長度: " . mb_strlen($test, 'UTF-8') . "\n";
echo "十六進制: " . bin2hex($test) . "\n";
// 檢測瀏覽器接收編碼
echo "\nHTTP_ACCEPT_CHARSET: " . ($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '未設置') . "\n";
echo "CONTENT_TYPE: " . ($_SERVER['CONTENT_TYPE'] ?? '未設置') . "\n";
?>
Linux PHP 中文亂碼 90% 由 `default_charset` 未設置為 UTF-8 引起。建議採用三層保障:php.ini 全局配置 + 代碼入口 header() 兜底 + HTML meta 聲明。配合文件編碼統一為 UTF-8 無 BOM,可徹底根治編碼問題。