问题根源分析
问题的核心在于 编码不统一,织梦系统在处理中文时,会经历“前台输入 -> PHP处理 -> 数据库存储 -> 数据库读取 -> PHP处理 -> 后台/前台显示”这个过程,如果其中任何一个环节的编码与其它环节不一致,中文就会出现乱码,甚至无法保存。

(图片来源网络,侵删)
理想状态下的统一编码是:
- 数据库字符集:
utf8mb4(强烈推荐,能支持emoji) 或utf8 - 数据库连接校对:
utf8mb4_general_ci或utf8_general_ci - 网站文件编码:
UTF-8(无BOM头) - PHP环境编码:
UTF-8
解决方案(请按顺序排查)
第一步:检查并修改数据库编码(最常见的原因)
这是最有可能的原因,尤其是在旧版本或从其他环境迁移过来的网站。
-
登录phpMyAdmin
- 进入你的网站数据库管理工具,通常是
phpMyAdmin。
- 进入你的网站数据库管理工具,通常是
-
检查数据库编码
(图片来源网络,侵删)- 在左侧选择你的织梦数据库名称。
- 在右侧,点击“操作”选项卡。
- 找到“数据库字符集”和“数据库校对规则”。
- 确保它们是
utf8mb4和utf8mb4_general_ci,如果不是,请修改并执行。 - 为什么用
utf8mb4? 因为标准的utf8在MySQL中最多只能支持3个字节的字符,而一些特殊的中文Emoji表情需要4个字节,utf8mb4是完全兼容utf8的超集,能完美解决这个问题。
-
检查数据表编码
- 在左侧数据库列表下,点击你的数据库名,展开所有表。
- 勾选所有表(或者逐个检查核心表,如
dede_archives、dede_arctype、dede_addonarticle等)。 - 在下拉菜单中选择“更改字符集”为
utf8mb4,校对规则为utf8mb4_general_ci,然后执行。 - 注意: 对于大型网站,此操作可能需要一些时间。
-
检查数据表字段编码
- 这是最关键的一步,即使表是
utf8mb4,里面的字段(如title,body)如果不是utf8mb4,同样会出问题。 - 选择一个核心表(
dede_archives),点击“结构”。 - 检查存储标题、内容等中文的字段(如
title,description,body),确保它们的“排序规则”是utf8mb4_general_ci。 - 如果不是,点击该字段的“更改”,修改排序规则,然后保存。
- 这是最关键的一步,即使表是
完成这一步后,去后台尝试保存一篇带中文的文章,看看问题是否解决,如果问题依旧,请进行下一步。
第二步:检查并修复网站文件编码(BOM头问题)
文件编码不正确,特别是带有BOM(Byte Order Mark)头的UTF-8文件,是导致PHP解析错误的常见元凶。
-
检查核心文件
- 使用支持UTF-8编码的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开以下核心文件:
/include/common.inc.php(织梦核心配置文件)/dede/config.php(后台配置文件)
- 在编辑器中,查看文件的开头和结尾,看是否有乱码或不可见的字符(这就是BOM头)。
- 正确做法: 删除这些不可见字符,然后将文件另存为“UTF-8 无BOM格式”。
- 使用支持UTF-8编码的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开以下核心文件:
-
批量检查和修复
- 如果手动检查麻烦,可以使用一些在线工具或FTP软件的批量查找替换功能来移除BOM头。
- 在线BOM头检测与移除工具: 搜索 "在线BOM头检测工具",上传你的网站根目录文件进行检测和修复。
- FTP软件: 一些高级FTP客户端(如FileZilla)支持在服务器上直接查找和替换BOM头。
第三步:检查PHP环境配置
如果以上两步都无效,可能是PHP环境的默认编码设置问题。
-
检查
php.ini文件- 找到你的
php.ini文件位置(通常可以通过phpinfo()函数查看)。 - 搜索
default_charset这一行。 - 确保它的值是
UTF-8。default_charset = "UTF-8"
- 修改后,重启你的Web服务器(如Apache或Nginx)。
- 找到你的
-
检查MySQL连接字符集
- 打开
/data/common.inc.php文件。 - 找到
$cfg_db_language = 'gbk';这一行。 - 将其修改为
$cfg_db_language = 'utf8';。 - 注意: 这个设置是为了兼容旧版本,如果数据库已经是
utf8mb4,这一步的修改影响不大,但保持一致总是好的。
- 打开
第四步:终极修复(数据已损坏的情况)
如果数据库之前是 gbk 编码,后来才改成 utf8,但数据本身还是 gbk 编码的,那么就会出现“存进去的是乱码,读出来也是乱码”的情况,这时需要对数据进行转码。
-
使用phpMyAdmin转码
-
在phpMyAdmin中,选择你的数据库。
-
点击顶部的“导入”选项卡。
-
在“格式”中选择“SQL”。
-
在“SQL查询”框中,粘贴以下代码(请务必先备份数据库!):
-- 将所有表从gbk转成utf8mb4 ALTER DATABASE 你的数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci; -- 循环转码所有表 SET @tables = NULL; SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables FROM information_schema.tables WHERE table_schema = (SELECT DATABASE()); SET @tables = CONCAT('ALTER TABLE ', @tables, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'); PREPARE stmt FROM @tables; EXECUTE stmt; DEALLOCATE PREPARE stmt; -
将代码中的
你的数据库名替换成你自己的数据库名。 -
点击“执行”。
-
-
使用织梦自带的转换工具
- 织梦DedeCMS V5.7版本之后,通常自带一个编码转换工具。
- 登录织梦后台,在“系统” -> “系统设置” -> “数据库转换工具”中,你可以找到从
gbk转换到utf8的选项,按照提示操作即可。
总结与排查顺序
遇到“织梦后台不能保存中文”的问题,请按照以下顺序操作:
-
首选方案(成功率90%以上):
- 登录
phpMyAdmin,将数据库、数据表、关键字段的字符集全部修改为utf8mb4及其对应的校对规则。
- 登录
-
其次方案:
- 检查并修复网站核心文件(如
common.inc.php)的BOM头问题,确保文件编码为“UTF-8 无BOM格式”。
- 检查并修复网站核心文件(如
-
再次方案:
- 检查服务器
php.ini文件中的default_charset设置是否为UTF-8。
- 检查服务器
-
最后方案(数据已损坏):
- 使用
phpMyAdmin或织梦自带的工具,对数据库数据进行从gbk到utf8的批量转码。
- 使用
重要提醒: 在进行任何数据库修改之前,请务必备份你的整个数据库!以防操作失误导致数据丢失。
希望这些步骤能帮助你解决问题!
