首页| 版块| 我的| 发帖| 消息
主题:关于论坛编码及转换函数
zhangjingyu 
“你写的这个文件太牛了,可以非常方便直观的看到各个字段的情况!只是这个表有点奇怪啊:
表名:pw_cnalbum 字符集:gbk_chinese_ci aname    varchar(50)    gbk_chinese_ci    📌 GBK    兼容老系统,不支持 emoji
不是说好的utf-8吗?”(引用内容)哈哈,你抓到问题的关键了!🎯 这说明我们之前的猜测得到了证实!

为什么是 gbk_chinese_ci?
真相:这个表就是在 GBK 时代创建的!

你的论坛可能是这样的历史:
1. 最早安装时 → 论坛是 GBK 版本
2. 创建表 pw_cnalbum → 默认字符集就是 GBK
3. 后来升级 → 只升级了程序,数据库没转换
4. 数据库全局设置改了 → 新表用 utf8mb4
5. 但老表(pw_cnalbum)→ 还是原来的 GBK 编码!

你的数据库现状
根据之前的查询:
character_set_database = utf8mb4(新建表用这个)
    ↓
pw_cnalbum 表 → gbk_chinese_ci(旧表还是 GBK)
    ↓
aname 字段 → gbk_chinese_ci(跟着表走)
所以:相册名在硬盘上存的是 GBK,不是 UTF-8! 🎯

两种可能
可能1:这个表是老的
论坛升级前:GBK 版本
    ↓
创建了 pw_cnalbum 表
    ↓
编码:gbk_chinese_ci ✅
    ↓
后来升级到 UTF-8 版本
    ↓
新表用 utf8mb4
    ↓
但 pw_cnalbum 没转换 → 还是 GBK

可能2:论坛本身还是 GBK 版本
论坛版本:GBK
    ↓
所有表都是 gbk_chinese_ci
    ↓
但数据库全局设置是 utf8mb4
    ↓
所以新表会用 utf8mb4
    ↓
但老的 GBK 表保持不变

验证方法
用你刚写的工具查看其他表:
表名:pw_cnalbum → gbk_chinese_ci(GBK)
表名:pw_cnphoto → ?
表名:pw_cnuser  → ?
表名:pw_cnconfig → ?
如果所有表都是 gbk_chinese_ci,说明论坛就是 GBK 版本。
如果有些是 utf8mb4,有些是 gbk,说明是升级遗留问题。

为什么你的转换函数能工作?
实际存储:GBK
    ↓
MySQL 连接:character_set_results = gbk
    ↓
返回给 PHP:GBK(从硬盘读出来的就是 GBK)
    ↓
你的函数:convertToUtf8(GBK数据, 'UTF-8', 'GBK')
    ↓
显示:中文正常 ✅
你之前的转换函数正好把这个 GBK 数据转成了 UTF-8 显示! 💪

结论
环节    实际编码    说明
数据库全局    utf8mb4    新建表用这个
pw_cnalbum 表    gbk_chinese_ci    旧表,GBK 编码
aname 字段    gbk_chinese_ci    跟着表走
硬盘存储    GBK 字节    物理存储是 GBK
PHP 接收    GBK    MySQL 返回 GBK
你的页面    UTF-8    转换后显示

建议
既然现在一切正常,保持现状就好!😄

✅ 老表(GBK)→ 继续用 GBK
✅ 新表(UTF-8)→ 继续用 UTF-8
✅ 你的转换函数 → 自动适应两种编码
✅ 页面显示 → 全部 UTF-8
你的代码已经完美兼容了这两种编码! 🎉

这个工具没白写,它帮你发现了一个重要的真相! 现在你知道为什么相册名要用函数转换了——因为它在硬盘上本来就是 GBK!💪😄
zhangjingyu回帖于2026-08-14 09:31[查看电脑版]
下一页 (1/2)
下一楼»:“我说我当初用穷举法列相册名的时候,也没写几行代码啊,也没考虑到转换的问题(其实多了 ..
«上一楼:“谢谢你详细的解释,终于有了感性的认识。原来从发起请求开始到最终的呈现,中间要经过这 ..

查看全部回帖(25)
«返回主帖