问题的根源几乎可以肯定是 PHP 的 default_charset 设置错误,或者更具体地说,是 PHP 和数据库的字符集不匹配。

(图片来源网络,侵删)
下面我将从原因分析到解决方案,为你提供一个完整、详细的排查和解决流程。
问题根源分析
-
PHP 默认字符集问题 (最常见)
- 在
php.ini配置文件中,有一个参数default_charset,如果它被设置为了UTF-8以外的值(比如被注释掉; default_charset = "UTF-8",或者被设置成了GBK),那么当 DedeCMS 后台使用mb_strlen()这类多字节字符串函数时,就可能因为字符集识别错误而无法正确处理中文字符,导致输入框无法输入或显示乱码。
- 在
-
数据库字符集问题
- DedeCMS 的数据存储在 MySQL/MariaDB 数据库中,如果数据库的默认字符集、表的字符集以及字段的字符集三者不一致,或者不是
utf8mb4(推荐),就可能导致数据读写时出现乱码,进而影响前台和后台的输入。
- DedeCMS 的数据存储在 MySQL/MariaDB 数据库中,如果数据库的默认字符集、表的字符集以及字段的字符集三者不一致,或者不是
-
PHP 与数据库连接字符集问题
(图片来源网络,侵删)- PHP 在连接数据库时,如果没有明确指定使用
utf8mb4字符集进行通信,那么即使数据库本身是utf8mb4,数据在传输过程中也可能因为编码不一致而出错。
- PHP 在连接数据库时,如果没有明确指定使用
解决方案 (按优先级顺序排查)
请按照以下步骤逐一操作,每完成一步,就测试一下后台是否能输入中文,这样可以快速定位问题。
修改 PHP default_charset (成功率最高)
这是最常见也是最有效的解决方法。
-
找到
php.ini文件- 登录你的服务器(虚拟主机或云服务器)。
- 在网站根目录下创建一个名为
phpinfo.php的文件,内容为:<?php phpinfo(); ?>
- 在浏览器中访问这个文件(
http://你的域名/phpinfo.php),然后按Ctrl+F搜索 "Loaded Configuration File",这里显示的就是你当前网站使用的php.ini文件的完整路径。
-
编辑
php.ini文件
(图片来源网络,侵删)-
使用 FTP 或 SSH 连接到服务器,找到并下载
php.ini文件。 -
用文本编辑器(如 Notepad++, VS Code)打开它。
-
搜索
default_charset这一行。 -
确保它被设置为
UTF-8,并且没有被分号 注释掉。; 找到这一行 ; default_charset = "UTF-8" ; 修改为(如果被注释了,去掉分号) default_charset = "UTF-8"
注意:现在更推荐使用
UTF-8而不是GBK。
-
-
重启 PHP 服务
- 对于虚拟主机用户:这个步骤你无法操作,需要联系你的主机商客服,让他们帮你修改
default_charset为UTF-8并重启服务,这是最常见的情况,很多虚拟主机的默认配置就是错的。 - 对于 VPS/云服务器用户:如果你是自己管理的服务器,重启 PHP 服务,如果你使用的是 PHP-FPM,可以执行:
# 根据你的系统和服务名称进行调整 systemctl restart php8.1-fpm # 假设你用的是 PHP 8.1 # 或者 service php-fpm restart
- 对于虚拟主机用户:这个步骤你无法操作,需要联系你的主机商客服,让他们帮你修改
-
测试
清除浏览器缓存,重新登录 DedeCMS 后台,尝试输入中文,很多时候问题就在这里解决了。
检查并修正数据库字符集
如果方案一无效,那问题很可能出在数据库上。
-
登录数据库管理工具
使用 phpMyAdmin 或其他数据库客户端工具登录你的数据库。
-
检查数据库、表、字段的字符集
- 检查数据库:在 phpMyAdmin 左侧选择你的数据库名,在“操作”选项卡中,查看“数据库字符集”是否为
utf8mb4,如果不是,选择utf8mb4并执行。 - 检查数据表:点击你的数据库名,展开表列表,检查
dede_archives(文章表) 等核心表的“表字符集”,同样应为utf8mb4,如果不是,需要修改(对于大表,修改操作可能很耗时)。 - 检查字段:点击某个表,如
dede_archives,在“结构”选项卡中,检查title(标题),body(内容) 等字段的“排序规则”(Collation),应为utf8mb4_general_ci或utf8mb4_unicode_ci。
- 检查数据库:在 phpMyAdmin 左侧选择你的数据库名,在“操作”选项卡中,查看“数据库字符集”是否为
-
执行 SQL 语句修正 (推荐)
-
如果手动修改麻烦,可以在 phpMyAdmin 的 SQL 查询窗口中执行以下命令,将整个数据库的字符集统一修正为
utf8mb4(请先备份数据库!)。-- 1. 修改数据库默认字符集 ALTER DATABASE `你的数据库名` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 2. 修改所有表的字符集 SELECT CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.tables WHERE table_schema = '你的数据库名'; -- 复制上面查询结果的所有SQL语句,执行它们 -- 3. 修改所有字段的字符集 SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.columns WHERE table_schema = '你的数据库名' AND CHARACTER_SET_NAME != 'utf8mb4'; -- 同样,复制结果并执行
-
修改 DedeCMS 配置文件 (强制指定字符集)
如果以上方法都无效,可以尝试在 DedeCMS 的配置文件中强制指定字符集。
-
修改
data/config.cache.inc.php- 这个文件是 DedeCMS 的核心配置文件缓存,打开它。
- 找到
$cfg_soft_lang这一行,确保它的值是utf-8。$cfg_soft_lang = 'utf-8';
-
修改
include/dedesql.class.php(高级操作)- 在 DedeCMS 连接数据库的类文件中,可以强制设置连接字符集。
- 打开
/include/dedesql.class.php文件。 - 找到
function SetQuery($sql)函数,在其中$this->ExecuteNoneQuery("SET NAMES 'utf8'");这一行。 - 强烈建议将
'utf8'修改为'utf8mb4',因为utf8mb4能更好地支持 Emoji 表情和一些特殊字符。// 在 SetQuery 函数中找到这行并修改 $this->ExecuteNoneQuery("SET NAMES 'utf8mb4'");
总结与快速排查清单
- 首选方案:联系你的虚拟主机商,让他们把服务器的
default_charset修改为UTF-8,这是 80% 情况下的解决方案。 - 如果自己有服务器:修改
php.ini文件,设置default_charset = "UTF-8",然后重启 PHP 服务。 - 检查数据库:使用 phpMyAdmin 确保数据库、表、字段的字符集都是
utf8mb4。 - 最后手段:修改 DedeCMS 的
data/config.cache.inc.php和include/dedesql.class.php文件,强制使用utf-8或utf8mb4。
希望这个详细的指南能帮助你解决问题!
