凌峰创科服务平台

dedecms网站乱码,如何快速解决?

核心原因分析

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

dedecms网站乱码,如何快速解决?-图1
(图片来源网络,侵删)

主要有以下几个场景:

  1. 数据库编码与网页编码不一致:数据以 gbk 编码存入数据库,但网页以 utf-8 编码读取,反之亦然。
  2. PHP 文件编码与网页编码不一致:PHP 脚本文件本身保存为了 gbk,但网页声明为 utf-8
  3. 网页 HTML 声明编码与实际编码不一致:HTML 头部 <meta charset="UTF-8"> 声明了 utf-8,但文件实际保存为了 gbk
  4. 数据库连接时未指定编码:PHP 连接数据库时,没有明确告诉数据库使用哪种编码来传输数据。

现代网站强烈推荐统一使用 UTF-8 编码,因为它能完美支持全球所有语言,避免很多不必要的麻烦。


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

第一步:检查网页编码声明

这是最直观、最简单的一步,用浏览器打开你的网站,然后按 F12 打开开发者工具,切换到 "Elements" (元素) 标签页。

  1. <head> 标签内找到 <meta charset="..."> 这一行。
  2. 查看它的值,通常是 UTF-8GBK
  3. 对比一下:如果网站内容显示为乱码,而这里声明的是 UTF-8,那么问题很可能出在数据库或文件编码上。

第二步:检查并统一 PHP 文件编码

你的所有 .php 文件(特别是 include 目录下的核心文件)和 .html 模板文件,都必须和第一步中声明的编码保持一致。

dedecms网站乱码,如何快速解决?-图2
(图片来源网络,侵删)
  • 如何检查?

    • 使用专业的代码编辑器(如 VS Code, Sublime Text, Notepad++)打开一个核心 PHP 文件,index.phpinclude/common.inc.php
    • 在编辑器底部状态栏,通常会显示当前文件的编码格式。
    • 检查模板文件:打开 /templets/default 目录下的 .htm 文件,同样检查其编码。
  • 如何修复?

    • 如果文件编码与网页声明不一致(网页声明 UTF-8,但文件是 GBK):
      1. 在代码编辑器中,将文件编码另存为(Save with Encoding)为与网页声明一致的编码(UTF-8 without BOM)。
      2. 重要:对于 PHP 文件,请务必选择 UTF-8 without BOMBOM(字节顺序标记)会在文件开头写入几个隐藏字符,这会导致 PHP 报错 "Cannot modify header information"(无法修改头信息),从而引发乱码或其它问题。
      3. 对所有核心 PHP 文件和模板文件执行此操作。

第三步:检查并修复数据库编码

这是最关键的一步,也是最容易出问题的地方。

新网站或可以清空数据库

dedecms网站乱码,如何快速解决?-图3
(图片来源网络,侵删)

如果你是刚开始搭建网站,或者可以接受清空数据库重新安装,那么这是最干净的方法:

  1. 创建数据库时指定编码:在创建数据库时,在"整理"或"Collation"选项中,选择 utf8_general_ciutf8mb4_general_ci (推荐 utf8mb4,因为它支持更多 Emoji 表情)。
  2. 安装 DedeCMS 时选择编码:在运行安装程序 install/index.php 时,在选择数据库编码的步骤,务必选择与你数据库一致的编码UTF-8

已存在数据的旧网站(重点)

如果你的网站已经运行了一段时间,数据都在数据库里,你需要进行编码转换。

操作前务必备份数据库!务必备份数据库!务必备份数据库!

  1. 登录 phpMyAdmin:这是管理数据库最常用的工具。

  2. 选择你的数据库:在左侧列表中点击你的数据库名。

  3. 检查当前数据库编码

    • 在顶部导航栏找到 "操作" (Operations) 选项卡。
    • 在 "数据库整理" (Database collation) 部分,查看当前的编码,如果是 gbk_chinese_ci,就需要转换。
  4. 执行转换(核心步骤)

    • 方法A:使用 phpMyAdmin 的转换功能(推荐)

      1. 仍然在 "操作" (Operations) 选项卡。
      2. 找到 "更改数据库整理" (Change database collation) 部分。
      3. 从下拉菜单中选择 utf8mb4_general_ci (强烈推荐) 或 utf8_general_ci
      4. 点击 "执行" (Go),phpMyAdmin 会自动转换整个数据库的结构和字符集。
    • 方法B:手动执行 SQL 语句(如果方法A不成功)

      1. 在 phpMyAdmin 的顶部,点击 "SQL" 选项卡。
      2. 将以下 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 执行窗口,粘贴并运行。
  5. 修改 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 乱码,请按以下清单逐一排查:

  1. [ ] 网页声明:浏览器 F12 查看 <meta charset>,确认是 UTF-8 还是 GBK
  2. [ ] 文件编码:用代码编辑器检查所有 .php.htm 文件,确保编码与网页声明一致,且 PHP 文件为 UTF-8 without BOM
  3. [ ] 数据库备份:在操作数据库之前,必须完整备份数据库!
  4. [ ] 数据库编码
    • 新站:创建数据库和安装程序时,选择 UTF-8 编码。
    • 旧站:通过 phpMyAdmin 将数据库、表、字段从 gbk 转换为 utf8mb4
  5. [ ] 配置文件:修改 /data/common.inc.php 中的 $cfg_db_language 变量,使其与数据库编码一致。
  6. [ ] 连接编码:检查数据库连接类文件,确保执行了
分享:
扫描分享到社交APP
上一篇
下一篇