核心原因分析
乱码的根本原因只有一个:数据在写入时和读取时使用的字符编码不一致。

主要有以下几个场景:
- 数据库编码与网页编码不一致:数据以
gbk编码存入数据库,但网页以utf-8编码读取,反之亦然。 - PHP 文件编码与网页编码不一致:PHP 脚本文件本身保存为了
gbk,但网页声明为utf-8。 - 网页 HTML 声明编码与实际编码不一致:HTML 头部
<meta charset="UTF-8">声明了utf-8,但文件实际保存为了gbk。 - 数据库连接时未指定编码:PHP 连接数据库时,没有明确告诉数据库使用哪种编码来传输数据。
现代网站强烈推荐统一使用 UTF-8 编码,因为它能完美支持全球所有语言,避免很多不必要的麻烦。
解决方案(请按顺序排查)
第一步:检查网页编码声明
这是最直观、最简单的一步,用浏览器打开你的网站,然后按 F12 打开开发者工具,切换到 "Elements" (元素) 标签页。
- 在
<head>标签内找到<meta charset="...">这一行。 - 查看它的值,通常是
UTF-8或GBK。 - 对比一下:如果网站内容显示为乱码,而这里声明的是
UTF-8,那么问题很可能出在数据库或文件编码上。
第二步:检查并统一 PHP 文件编码
你的所有 .php 文件(特别是 include 目录下的核心文件)和 .html 模板文件,都必须和第一步中声明的编码保持一致。

-
如何检查?
- 使用专业的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开一个核心 PHP 文件,
index.php或include/common.inc.php。 - 在编辑器底部状态栏,通常会显示当前文件的编码格式。
- 检查模板文件:打开
/templets/default目录下的.htm文件,同样检查其编码。
- 使用专业的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开一个核心 PHP 文件,
-
如何修复?
- 如果文件编码与网页声明不一致(网页声明
UTF-8,但文件是GBK):- 在代码编辑器中,将文件编码另存为(Save with Encoding)为与网页声明一致的编码(
UTF-8 without BOM)。 - 重要:对于 PHP 文件,请务必选择
UTF-8 without BOM。BOM(字节顺序标记)会在文件开头写入几个隐藏字符,这会导致 PHP 报错 "Cannot modify header information"(无法修改头信息),从而引发乱码或其它问题。 - 对所有核心 PHP 文件和模板文件执行此操作。
- 在代码编辑器中,将文件编码另存为(Save with Encoding)为与网页声明一致的编码(
- 如果文件编码与网页声明不一致(网页声明
第三步:检查并修复数据库编码
这是最关键的一步,也是最容易出问题的地方。
新网站或可以清空数据库

如果你是刚开始搭建网站,或者可以接受清空数据库重新安装,那么这是最干净的方法:
- 创建数据库时指定编码:在创建数据库时,在"整理"或"Collation"选项中,选择
utf8_general_ci或utf8mb4_general_ci(推荐utf8mb4,因为它支持更多 Emoji 表情)。 - 安装 DedeCMS 时选择编码:在运行安装程序
install/index.php时,在选择数据库编码的步骤,务必选择与你数据库一致的编码,UTF-8。
已存在数据的旧网站(重点)
如果你的网站已经运行了一段时间,数据都在数据库里,你需要进行编码转换。
操作前务必备份数据库!务必备份数据库!务必备份数据库!
-
登录 phpMyAdmin:这是管理数据库最常用的工具。
-
选择你的数据库:在左侧列表中点击你的数据库名。
-
检查当前数据库编码:
- 在顶部导航栏找到 "操作" (Operations) 选项卡。
- 在 "数据库整理" (Database collation) 部分,查看当前的编码,如果是
gbk_chinese_ci,就需要转换。
-
执行转换(核心步骤):
-
方法A:使用 phpMyAdmin 的转换功能(推荐)
- 仍然在 "操作" (Operations) 选项卡。
- 找到 "更改数据库整理" (Change database collation) 部分。
- 从下拉菜单中选择
utf8mb4_general_ci(强烈推荐) 或utf8_general_ci。 - 点击 "执行" (Go),phpMyAdmin 会自动转换整个数据库的结构和字符集。
-
方法B:手动执行 SQL 语句(如果方法A不成功)
- 在 phpMyAdmin 的顶部,点击 "SQL" 选项卡。
- 将以下 SQL 代码粘贴进去,然后点击 "执行",这段代码会分步转换数据库、数据表和字段的字符集。
-- 第1步:转换数据库默认字符集 ALTER DATABASE `你的数据库名` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 第2步:转换所有数据表的字符集 -- 注意:如果你的表前缀不是 'dede_',请修改下面的代码 SELECT CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') FROM information_schema.tables WHERE table_schema = '你的数据库名' AND table_type = 'BASE TABLE'; -- 复制上面查询结果(所有 ALTER TABLE 语句),然后回到 SQL 执行窗口,粘贴并运行。
-
-
修改 DedeCMS 配置文件以匹配新的数据库编码:
-
用代码编辑器打开
/data/common.inc.php文件。 -
找到
$cfg_db_language这一行。 -
将它的值修改为你的新编码:
// 如果改成了 utf8mb4 $cfg_db_language = 'utf8mb4'; // 如果改成了 utf8 // $cfg_db_language = 'utf8';
-
保存文件。
-
第四步:确保数据库连接时使用正确编码
即使数据库本身是 UTF-8,PHP 连接时没有指定编码,也可能导致乱码。common.inc.php 文件里的 $cfg_db_language 变量已经处理了这个问题,如果修改后仍有问题,可以手动在数据库连接语句后添加一行代码。
打开 /include/dedesql.class.php 文件(或你自定义的数据库类文件),找到 connect() 函数,在成功连接后、执行任何查询前,添加如下代码:
// 在执行 $this -> SetQuery($this -> version == 'mysql' ? 'SET NAMES utf8mb4' : 'SET NAMES utf8'); 这一行附近确保它存在并正确
// 如果没有,就手动添加
mysql_query("SET NAMES utf8mb4");
// 或者对于 PDO
// $this->db->exec("SET NAMES utf8mb4");
注意:新版本的 DedeCMS 通常已经自动处理了这一步,所以这一步可以作为最后的检查手段。
总结与排查清单
遇到 DedeCMS 乱码,请按以下清单逐一排查:
- [ ] 网页声明:浏览器
F12查看<meta charset>,确认是UTF-8还是GBK。 - [ ] 文件编码:用代码编辑器检查所有
.php和.htm文件,确保编码与网页声明一致,且 PHP 文件为UTF-8 without BOM。 - [ ] 数据库备份:在操作数据库之前,必须完整备份数据库!
- [ ] 数据库编码:
- 新站:创建数据库和安装程序时,选择
UTF-8编码。 - 旧站:通过 phpMyAdmin 将数据库、表、字段从
gbk转换为utf8mb4。
- 新站:创建数据库和安装程序时,选择
- [ ] 配置文件:修改
/data/common.inc.php中的$cfg_db_language变量,使其与数据库编码一致。 - [ ] 连接编码:检查数据库连接类文件,确保执行了
