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

Linux PHP 中文亂碼終極解決指南

     編輯:PHP 綜合知識

問題現象

在 Ubuntu/Debian/CentOS 等 Linux 發行版上運行 PHP 應用時,網頁輸出中文顯示為 、□□□ 或亂碼,但英文數字正常。這通常發生在未涉及數據庫的純 PHP 輸出場景。

根因分析

PHP 默認的 `default_charset` 為 `ISO-8859-1`(Latin-1),無法正確編碼中文字符。當瀏覽器接收到無 charset 聲明的響應時,會嘗試自動檢測或使用默認編碼,導致解碼錯誤。

快速修復方案

方法一:修改 php.ini(推薦,全局生效)

# 定位配置文件
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');
?>

方法三:Web 伺服器層面設置

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

系統級編碼檢查清單

層級檢查項目正確值
PHPdefault_charsetUTF-8
PHPmbstring.internal_encodingUTF-8
PHPmbstring.http_outputUTF-8
數據庫連接PDO::MYSQL_ATTR_INIT_COMMANDSET NAMES utf8mb4
HTML<meta charset><meta charset="UTF-8">
文件編碼PHP 源文件UTF-8 無 BOM
終端LANG/LC_ALLzh_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";
?>

常見誤區

  • ❌ 以為 `meta` 標籤能覆蓋 HTTP Header(實際 Header 優先級更高)
  • ❌ 修改了 php.ini 但忘記重載 PHP-FPM/Apache
  • ❌ 文件本身保存為 GBK/Big5 卻聲稱 UTF-8
  • ❌ 忽略數據庫連接字符集設置(`SET NAMES utf8mb4`)

總結

Linux PHP 中文亂碼 90% 由 `default_charset` 未設置為 UTF-8 引起。建議採用三層保障:php.ini 全局配置 + 代碼入口 header() 兜底 + HTML meta 聲明。配合文件編碼統一為 UTF-8 無 BOM,可徹底根治編碼問題。

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