GBK 和 UTF-8 是两种不同的字符编码方式,它们决定了网站如何存储和显示文字(尤其是中文)。 选择错误的编码会导致网站出现乱码。

(图片来源网络,侵删)
核心概念:什么是字符编码?
你可以把字符编码想象成一本“字典”。
- 文字:就是我们看到的“你好,世界!”。
- 计算机:它不认识文字,只认识 0 和 1。
- 字符编码:就是这本字典,它规定了每个文字(你”)对应哪个数字(你”在 GBK 字典里是
C4 E3,在 UTF-8 字典里是E4 BD A0),计算机再把这个数字转换成二进制存储。
如果网站(前端)用的“字典”和数据库(后端)存的“字典”不一样,那么读出来的文字就会对不上,显示成一堆看不懂的符号,这就是乱码。
GBK 和 UTF-8 的详细区别
| 特性 | GBK | UTF-8 |
|---|---|---|
| 全称 | Chinese Internal Code Specification | 8-bit Unicode Transformation Format |
| 起源 | 中国国家标准,基于 GB2312 扩展而成。 | 国际标准,Unicode(万国码)的一种实现方式。 |
| 字符范围 | 主要包含简体中文、繁体中文和部分英文、符号。 | 包含全球几乎所有语言的字符,如中文、英文、日文、韩文、俄文、emoji 表情等。 |
| 存储空间 | 一个中文字符占用 2 个字节。 | 一个中文字符通常占用 3 个字节(在特定情况下可能更多)。 |
| 兼容性 | 兼容性较差,主要在中国大陆地区使用。 | 国际通用兼容性最好,是现代 Web 开发的推荐标准。 |
| 未来趋势 | 逐渐被淘汰,属于过时的技术。 | 绝对的主流和未来趋势。 |
在 DedeCMS 中的具体表现和影响
当你选择使用 GBK 还是 UTF-8 版本的 DedeCMS 时,这会影响你网站的方方面面:
数据库
- GBK 版本:数据库的表、字段默认使用
gbk_chinese_ci字符集。 - UTF-8 版本:数据库的表、字段默认使用
utf8_general_ci或utf8mb4_general_ci字符集。- 注意:
utf8在 MySQL 中最多支持 3 个字节,无法存储 emoji 表情和一些特殊字符,现代 DedeCMS 通常使用utf8mb4,它最多支持 4 个字节,完全兼容 Unicode。
- 注意:
文件编码
- GBK 版本:所有 PHP 模板文件(
.php)、HTML 模板文件(.htm)、CSS 文件(.css)、JS 文件(.js)内部的编码都是GBK。 - UTF-8 版本:所有文件的内部编码都是
UTF-8(通常文件开头会有BOM标记,或者 IDE 设置为无 BOM 的 UTF-8)。
网站后台设置
- 在后台的系统基本参数中,会有一个“网站编码”的选项,它会自动设置为与安装时选择的编码一致,通常保持默认即可。
数据交互
- 当你在后台发布文章、填写栏目名称时,你输入的文字会被按照当前编码格式存入数据库。
- 当网站前端页面展示内容时,PHP 程序会从数据库读取数据,并告诉浏览器:“我用的是 GBK/UTF-8 编码,请按这个方式显示”,浏览器收到指令后,用对应的“字典”翻译文字,从而正确显示。
如何选择?GBK vs UTF-8
这是一个非常关键的决定,一旦网站数据量变大,修改编码将非常痛苦。

(图片来源网络,侵删)
强烈推荐:选择 UTF-8 版本
选择 UTF-8 的理由:
-
避免乱码:这是最核心的原因,如果你的网站未来可能需要:
- 接收用户评论,用户可能输入 emoji 表情。
- 引入繁体、英文或其他语言的内容。
- 使用一些国际化的插件或模板。 GBK 会直接将这些内容显示为乱码,而 UTF-8 可以完美支持。
-
国际化趋势:UTF-8 是全球互联网的标准,几乎所有现代的服务器、操作系统、开发工具都默认支持 UTF-8,选择 UTF-8 可以让你的网站更易于维护和扩展。
-
SEO 友好:虽然搜索引擎对乱码的处理能力很强,但一个完美显示的网站无疑对用户体验和 SEO 更有利。
(图片来源网络,侵删) -
社区和插件支持:现在新开发的 DedeCMS 模板、插件几乎都只提供 UTF-8 版本,使用 GBK 版本会让你在寻找资源时处处受限。
什么情况下可以考虑 GBK?
- 非常老旧的服务器环境:服务器或数据库可能对 UTF-8 支持不佳,且无法升级。
- 纯内部使用的、极简的网站:比如一个内部管理系统,只涉及简体中文,且所有开发者都明确知道使用 GBK,并且未来不会有任何扩展。
- 数据迁移的遗留问题:你需要从一个非常老旧的、基于 GBK 的 DedeCMS 网站迁移数据,为了保持数据一致性,可能暂时选择 GBK。
但请注意,这些情况在今天已经非常罕见了。
如果编码错了怎么办?(如何解决乱码)
如果你遇到了乱码问题,说明网站的编码不统一,解决方案的核心是统一编码。
最佳方案:从 GBK 转换到 UTF-8
这个过程比较复杂,不能简单地改个设置,因为数据已经用错误的编码存了,步骤大致如下:
- 备份数据库!备份数据库!备份数据库! (重要的事情说三遍)
- 导出数据库:使用 PHPMyAdmin 等工具,将数据库导出为
.sql文件。 - 转换文件编码:
- 使用代码编辑器(如 VS Code, Sublime Text, Notepad++)将网站所有 PHP、HTML、CSS、JS 文件的编码从
GBK转换为UTF-8(推荐选择UTF-8 without BOM)。
- 使用代码编辑器(如 VS Code, Sublime Text, Notepad++)将网站所有 PHP、HTML、CSS、JS 文件的编码从
- 转换数据库编码:
- 这是最关键也是最复杂的一步,你需要用文本编辑器打开导出的
.sql文件。 - 将文件中所有的
gbk_chinese_ci替换为utf8mb4_general_ci。 - 将文件中所有的
CHARSET=gbk或CHARSET='gbk'替换为CHARSET=utf8mb4。 - 注意:直接替换字符集定义是不够的,你还需要用专业的工具(如
iconv命令行工具或专门的数据库转换脚本)来转换数据本身的编码,简单的文本替换无法解决数据乱码问题。
- 这是最关键也是最复杂的一步,你需要用文本编辑器打开导出的
- 清空并重建数据库:在你的 UTF-8 版本 DedeCMS 的数据库中,先清空所有表。
- 导入转换后的 SQL 文件:将步骤 4 中处理好的
.sql文件导入到新的 UTF-8 数据库中。 - 修改配置文件:确保 DedeCMS 的配置文件
data/common.inc.php中的数据库连接字符集设置为utf8mb4。
这个过程风险很高,建议不熟悉操作的用户寻求专业人士的帮助。
| GBK | UTF-8 | |
|---|---|---|
| 定位 | 过时的、区域性的编码 | 现代、国际通用的标准编码 |
| 优势 | 存储空间略小(中文2字节 vs 3字节) | 无乱码风险、支持全球语言、proof、社区支持好 |
| 劣势 | 乱码风险高、扩展性差、逐渐被淘汰 | 存储空间略大 |
| 选择建议 | 除非有特殊且无法克服的遗留问题,否则不要选择。 | 所有新项目都应该选择 UTF-8 版本。 |
对于任何新建的 DedeCMS 网站,请毫不犹豫地选择 UTF-8 版本,这会为你省去未来无数的麻烦。
