织梦utf8转gbk编码注意事项

UTF-8 转 GBK 是织梦老站常见的编码迁移需求,涉及文件、数据库、模板三层,任一环节疏忽都会产生乱码。

一、为什么要转 GBK

部分老站点部署在 Windows 服务器或对接 GBK 系统(如某些 ERP、统计平台),需要将 UTF-8 数据转为 GBK 以兼容。同时 GBK 中文占用 2 字节,比 UTF-8 的 3 字节节省约 30% 空间。

二、迁移前检查清单

注意: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'])

七、验证步骤

八、行动指引

迁移完成后,建议用 Xenu 工具扫描全站链接,排查是否存在页面乱码导致死链。同时连续观察一周,关注搜索流量是否因编码变更出现波动。如非必要,建议长期目标仍是迁回 UTF-8,拥抱现代化标准。