织梦后台不能保存中文

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 织梦建站 正文

问题根源分析

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

织梦后台不能保存中文
(图片来源网络,侵删)

理想状态下的统一编码是:

  • 数据库字符集: utf8mb4 (强烈推荐,能支持emoji) 或 utf8
  • 数据库连接校对: utf8mb4_general_ciutf8_general_ci
  • 网站文件编码: UTF-8 (无BOM头)
  • PHP环境编码: UTF-8

解决方案(请按顺序排查)

第一步:检查并修改数据库编码(最常见的原因)

这是最有可能的原因,尤其是在旧版本或从其他环境迁移过来的网站。

  1. 登录phpMyAdmin

    • 进入你的网站数据库管理工具,通常是 phpMyAdmin
  2. 检查数据库编码

    织梦后台不能保存中文
    (图片来源网络,侵删)
    • 在左侧选择你的织梦数据库名称。
    • 在右侧,点击“操作”选项卡。
    • 找到“数据库字符集”和“数据库校对规则”。
    • 确保它们是 utf8mb4utf8mb4_general_ci,如果不是,请修改并执行。
    • 为什么用 utf8mb4 因为标准的 utf8 在MySQL中最多只能支持3个字节的字符,而一些特殊的中文Emoji表情需要4个字节,utf8mb4 是完全兼容 utf8 的超集,能完美解决这个问题。
  3. 检查数据表编码

    • 在左侧数据库列表下,点击你的数据库名,展开所有表。
    • 勾选所有表(或者逐个检查核心表,如 dede_archivesdede_arctypedede_addonarticle 等)。
    • 在下拉菜单中选择“更改字符集”为 utf8mb4,校对规则为 utf8mb4_general_ci,然后执行。
    • 注意: 对于大型网站,此操作可能需要一些时间。
  4. 检查数据表字段编码

    • 这是最关键的一步,即使表是 utf8mb4,里面的字段(如 title, body)如果不是 utf8mb4,同样会出问题。
    • 选择一个核心表(dede_archives),点击“结构”。
    • 检查存储标题、内容等中文的字段(如 title, description, body),确保它们的“排序规则”是 utf8mb4_general_ci
    • 如果不是,点击该字段的“更改”,修改排序规则,然后保存。

完成这一步后,去后台尝试保存一篇带中文的文章,看看问题是否解决,如果问题依旧,请进行下一步。


第二步:检查并修复网站文件编码(BOM头问题)

文件编码不正确,特别是带有BOM(Byte Order Mark)头的UTF-8文件,是导致PHP解析错误的常见元凶。

  1. 检查核心文件

    • 使用支持UTF-8编码的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开以下核心文件:
      • /include/common.inc.php (织梦核心配置文件)
      • /dede/config.php (后台配置文件)
    • 在编辑器中,查看文件的开头和结尾,看是否有乱码或不可见的字符(这就是BOM头)。
    • 正确做法: 删除这些不可见字符,然后将文件另存为“UTF-8 无BOM格式”。
  2. 批量检查和修复

    • 如果手动检查麻烦,可以使用一些在线工具或FTP软件的批量查找替换功能来移除BOM头。
    • 在线BOM头检测与移除工具: 搜索 "在线BOM头检测工具",上传你的网站根目录文件进行检测和修复。
    • FTP软件: 一些高级FTP客户端(如FileZilla)支持在服务器上直接查找和替换BOM头。

第三步:检查PHP环境配置

如果以上两步都无效,可能是PHP环境的默认编码设置问题。

  1. 检查 php.ini 文件

    • 找到你的 php.ini 文件位置(通常可以通过 phpinfo() 函数查看)。
    • 搜索 default_charset 这一行。
    • 确保它的值是 UTF-8
      default_charset = "UTF-8"
    • 修改后,重启你的Web服务器(如Apache或Nginx)。
  2. 检查MySQL连接字符集

    • 打开 /data/common.inc.php 文件。
    • 找到 $cfg_db_language = 'gbk'; 这一行。
    • 将其修改为 $cfg_db_language = 'utf8';
    • 注意: 这个设置是为了兼容旧版本,如果数据库已经是 utf8mb4,这一步的修改影响不大,但保持一致总是好的。

第四步:终极修复(数据已损坏的情况)

如果数据库之前是 gbk 编码,后来才改成 utf8,但数据本身还是 gbk 编码的,那么就会出现“存进去的是乱码,读出来也是乱码”的情况,这时需要对数据进行转码。

  1. 使用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;
    • 将代码中的 你的数据库名 替换成你自己的数据库名。

    • 点击“执行”。

  2. 使用织梦自带的转换工具

    • 织梦DedeCMS V5.7版本之后,通常自带一个编码转换工具。
    • 登录织梦后台,在“系统” -> “系统设置” -> “数据库转换工具”中,你可以找到从 gbk 转换到 utf8 的选项,按照提示操作即可。

总结与排查顺序

遇到“织梦后台不能保存中文”的问题,请按照以下顺序操作:

  1. 首选方案(成功率90%以上):

    • 登录 phpMyAdmin,将数据库数据表关键字段的字符集全部修改为 utf8mb4 及其对应的校对规则。
  2. 其次方案:

    • 检查并修复网站核心文件(如 common.inc.php)的BOM头问题,确保文件编码为“UTF-8 无BOM格式”。
  3. 再次方案:

    • 检查服务器 php.ini 文件中的 default_charset 设置是否为 UTF-8
  4. 最后方案(数据已损坏):

    • 使用 phpMyAdmin 或织梦自带的工具,对数据库数据进行gbkutf8 的批量转码

重要提醒: 在进行任何数据库修改之前,请务必备份你的整个数据库!以防操作失误导致数据丢失。

希望这些步骤能帮助你解决问题!

-- 展开阅读全文 --
头像
织梦下载列表下载地址
« 上一篇 03-22
VPS安装DedeCMS详细步骤是什么?
下一篇 » 03-22

相关文章

取消
微信二维码
支付宝二维码

目录[+]