UTF-8 转 GBK 是织梦老站常见的编码迁移需求,涉及文件、数据库、模板三层,任一环节疏忽都会产生乱码。
一、为什么要转 GBK
部分老站点部署在 Windows 服务器或对接 GBK 系统(如某些 ERP、统计平台),需要将 UTF-8 数据转为 GBK 以兼容。同时 GBK 中文占用 2 字节,比 UTF-8 的 3 字节节省约 30% 空间。
二、迁移前检查清单
- 确认目标服务器支持 GBK(Linux 需安装 glibc-langpack-zh)
- 备份数据库与全站文件
- 统计含特殊字符(emoji、生僻字)的内容
- 确认第三方接口是否支持 GBK
- 下载织梦 GBK 版本安装包
注意:UTF-8 中的 emoji、四字节汉字在 GBK 中无对应字符,会丢失或显示为"?"。
三、文件编码转换
3.1 PHP 文件转换
# 批量转换 PHP 文件
find /www/wwwroot/yoursite -name "*.php" -exec iconv -f UTF-8 -t GBK {} -o {}.tmp \; -exec mv {}.tmp {} \;
# 转换模板文件
find /www/wwwroot/yoursite/templets -type f -exec iconv -f UTF-8 -t GBK {} -o {}.tmp \; -exec mv {}.tmp {} \;
3.2 去除 BOM
UTF-8 文件可能含 BOM 头,转换后需移除:
find /www/wwwroot/yoursite -name "*.php" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;
四、数据库字符集转换
4.1 导出 UTF-8 数据
mysqldump -u root -p --default-character-set=utf8mb4 dede_db > dede_utf8.sql
4.2 转换 SQL 文件编码
iconv -f UTF-8 -t GBK dede_utf8.sql > dede_gbk.sql
4.3 修改 SQL 中的字符集声明
sed -i 's/utf8mb4/gbk/g; s/utf8/gbk/g' dede_gbk.sql
4.4 创建 GBK 数据库并导入
CREATE DATABASE dede_db_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
mysql -u root -p --default-character-set=gbk dede_db_gbk < dede_gbk.sql
五、织梦配置修改
修改 /data/common.inc.php 数据库连接字符集:
$cfg_db_language='gbk';
修改模板 HTML meta 声明:
<meta charset="GBK">
<!-- 或 -->
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
六、常见问题原因分析
6.1 数据库中文乱码
原因:导入时未指定 --default-character-set=gbk。
解决:重新导入,并确认 MySQL 客户端连接字符集为 gbk。
6.2 模板输出乱码
原因:模板文件仍是 UTF-8,但页面声明 GBK。
解决:用 Notepad++ 将所有模板转为 ANSI/GBK 编码。
6.3 表单提交乱码
原因:浏览器按 UTF-8 提交,数据库按 GBK 存储。
注意:必须在所有表单页加
accept-charset="gbk",或在 PHP 接收端 iconv('UTF-8','GBK',$_POST['field'])。七、验证步骤
- 访问首页、列表页、详情页无乱码
- 登录后台无乱码
- 提交评论、留言无乱码
- 数据库查看中文记录正常
- 导出 SQL 文件查看中文正常
八、行动指引
迁移完成后,建议用 Xenu 工具扫描全站链接,排查是否存在页面乱码导致死链。同时连续观察一周,关注搜索流量是否因编码变更出现波动。如非必要,建议长期目标仍是迁回 UTF-8,拥抱现代化标准。