核心问题:字符集编码不一致
想象一下,你的文件名就像一封信,而“编码”就是这封信的语言(比如中文普通话、英文),如果发信人用中文写,但邮局(服务器)却按照英文来读,收信人(网站程序和数据库)自然就收到一堆看不懂的乱码。

(图片来源网络,侵删)
在DedeCMS上传文件的过程中,主要涉及三个环节:
- 你的浏览器/操作系统:你在这里创建了文件名。
- Web服务器(如 Apache, Nginx):它接收你的上传请求。
- PHP程序 & MySQL数据库:DedeCMS程序和数据库最终存储这个文件名。
只要这三个环节中任何一个环节的编码设置不匹配,就会出现乱码。
解决方案(按推荐顺序和效果)
请按照以下步骤逐一排查和解决,强烈建议先备份你的网站和数据库!
最常见且最有效的解决方案(修改PHP配置)
这是导致乱码的最主要原因,PHP的默认字符集可能不是UTF-8,导致它无法正确处理和传递中文字符。

(图片来源网络,侵删)
-
找到PHP配置文件:
- 对于使用 cPanel/宝塔面板 等控制面板的用户,通常可以在面板的“PHP设置”或“配置文件”中找到。
- 对于手动服务器的用户,该文件通常是
/etc/php.ini或/usr/local/php/etc/php.ini。
-
修改
default_charset和mbstring.encoding_translation:- 使用编辑器(如 Notepad++, VS Code)打开
php.ini文件。 - 搜索
default_charset,找到类似; default_charset = "UTF-8"的行,如果前面有分号 ,代表它被注释掉了,请去掉分号,并确保其值为UTF-8。default_charset = "UTF-8"
- 搜索
mbstring.encoding_translation,找到类似; mbstring.encoding_translation = On的行,同样,去掉分号并确保设置为On,这个选项可以让PHP自动将输入转换为内部编码。mbstring.encoding_translation = On
- 使用编辑器(如 Notepad++, VS Code)打开
-
重启Web服务器:
- 修改
php.ini后,必须重启你的Web服务器(Apache 或 Nginx)和PHP-FPM服务,配置才能生效。 - 在宝塔面板中,可以直接在面板里重启对应的服务。
- 在命令行中,可以使用
systemctl restart httpd(Apache) 或systemctl restart nginx php-fpm(Nginx)。
- 修改
这个方案能解决90%以上的上传中文文件名乱码问题。

(图片来源网络,侵删)
检查并统一数据库字符集
如果方案一无效,那么问题很可能出在数据库上,DedeCMS的程序和数据库字符集必须统一为 utf8 或 utf8mb4(强烈推荐后者,因为它能更好地支持Emoji和一些特殊字符)。
-
检查数据库字符集:
- 登录你的phpMyAdmin。
- 在左侧选择你的DedeCMS数据库。
- 在右侧的“操作”或“数据库信息”区域,查看“数据库校对规则”(Collation),它应该类似于
utf8mb4_general_ci或utf8_unicode_ci。
-
检查数据表字符集:
- 在phpMyAdmin中,点击你的数据库,然后点击左侧的“结构”标签。
- 查看主要的数据表,如
dede_archives(文章)、dede_arctype(栏目)、dede_upload(附件表) 等,它们的“校对规则”也应该是utf8mb4相关的。
-
如何修正:
- 如果发现数据库或表的字符集不是
utf8mb4,你需要进行转换。注意:转换过程有风险,务必先备份数据库! - 在phpMyAdmin中,选择你的数据库,点击顶部的“操作”选项卡。
- 在“更改数据库的字符集和排序规则”部分,选择
utf8mb4_general_ci,然后执行。 - 对于单个表,可以在phpMyAdmin中选中表,点击“操作”,然后在“更改表的字符集和排序规则”中选择
utf8mb4_general_ci。 - 对于大型网站,手动修改所有表非常麻烦。 你可以搜索“DedeCMS 数据库批量转换utf8mb4”等关键词,找到一些现成的SQL脚本或工具来批量执行。
- 如果发现数据库或表的字符集不是
检查DedeCMS程序本身的编码
-
检查
config.php:- 打开
/data/config.cache.inc.php文件(注意是.cache.inc.php后缀,这是编译后的配置文件)。 - 查找
$cfg_db_language = 'utf8';这一行,确保它的值是utf8,如果找不到,检查原始的/include/config.inc.php文件。
- 打开
-
检查模板和页面编码:
- 打开你的网站首页模板(通常是
/templets/default/index.htm)。 - 在
<head>标签内,找到<meta charset="...">这一行,确保它是<meta charset="utf-8">。 - 同时检查
<head>中的<title>和页面底部,确保没有硬编码的 GBK 或其他编码声明。
- 打开你的网站首页模板(通常是
针对Nginx服务器的额外配置(如果使用Nginx)
如果你使用的是Nginx作为Web服务器,它自己的配置也可能导致乱码。
在Nginx的配置文件(通常在 nginx.conf 或你网站的配置文件中)的 server 块里,添加或修改以下内容:
server {
# ... 其他配置 ...
# 解决中文文件名乱码
charset utf-8;
# 如果上传文件名在URL中,也需要解码
# 在处理上传请求的location块中添加
location / {
# ... 其他配置 ...
if ($args ~* "^dopost=upload&") {
# 解决POST请求中的中文乱码
set $charset_args "";
if ($request_method = POST) {
set $charset_args "$charset_args;charset=utf-8";
}
}
}
}
修改后,同样需要 nginx -s reload 来重新加载Nginx配置。
总结与排查流程
当你遇到中文上传乱码时,请按以下步骤进行排查:
- 【首要步骤】修改
php.ini:将default_charset和mbstring.encoding_translation设置为UTF-8和On,然后重启服务器,这是最可能解决问题的方法。 - 【次要步骤】检查数据库:登录phpMyAdmin,确保数据库和数据表的字符集是
utf8mb4,如果不是,进行转换(记得先备份!)。 - 【辅助步骤】检查程序文件:确认
config.cache.inc.php和模板文件中的编码声明是utf-8。 - 【特殊情况】检查Nginx配置:如果你用的是Nginx,检查其配置文件中是否正确设置了
charset。
绝大多数情况下,方案一(修改PHP配置) 就能完美解决问题,如果不行,再结合方案二进行排查,希望这些信息能帮助你成功解决乱码问题!
