老站整页声明 charset=gbk,新加的公告栏是从另一个系统复制过来的 UTF-8 片段。页面上出现 3 个问号和一个方块,抓源码看到那段中文的字节是 e4 b8 ad,被当成两个 GBK 字符拆开了。日志里能对上时间点,这种反而好排。
GBK 按双字节解析,UTF-8 的常用汉字是三字节,边界一对不上,相邻字节就被错配成别的字。同一个页面里两种编码混排,浏览器只按 meta 或响应头声明的那一种解码,另一部分永远显示不对。这一点先确认清楚,后面就不用反复试。
file -i notice.txt iconv -f UTF-8 -t GBK notice.txt -o notice_gbk.txt iconv -f GBK -t UTF-8 -c notice.txt | head -3
这次卡住的地方就在「GBK 页面乱码」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。
处理上按这个顺序:先确认 meta 声明和响应头里的字符集是否一致;把混入的片段用 iconv 转成 GBK 再贴进去 不要直接复制字节;确实要保留 UTF-8 就把整页转成 UTF-8 并同步改数据库连接串;转完抽查生僻字和全角标点 GBK 里没有的码位会变成问号。
结果对不对很好判断,刷新页面问号消失 控制台里 document.characterSet 和响应头声明一致。
