这类问题我又碰上了一次。日本站沿用了十年前的模板,页面编码是 Shift_JIS,meta 里也这么声明。Google 能猜对编码,百度抓到的标题全是乱码,日文关键词一条都排不上。
第一反应是「数据库连接是 utf8mb4,输出时又转了一次」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。响应头 Content-Type 没带 charset,只靠 meta 声明;sitemap 用 UTF-8 输出,和页面编码不一致;CDN 压缩后编码声明丢失。
上来先看响应头与 meta 的声明
curl -sI https://jp.example.com/ | grep -i content-type
然后统一改成 UTF-8 输出
header('Content-Type: text/html; charset=UTF-8');
转换存量模板文件
nkf -w --overwrite templates/*.html
剩下的就是用百度 UA 复验标题
curl -s -A 'Baiduspider' https://jp.example.com/ | grep -o '<title>[^<]*'
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
恢复的判定其实很直接。响应头与 meta 都是 UTF-8,百度抓到的标题显示正常,日文页面开始有展现。
这里还有个坑。编码问题在浏览器里可能被自动纠正,爬虫不一定有这份耐心,统一 UTF-8 最省事。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
