事情本身不复杂,线索都在日志里。搜索结果页把关键词回显到 h1,中间过了一道转义,数据库连接又按 latin1 读出来,中文全变成了问号。搜索结果里标题显示成一串问号。
第一反应是「页面没有声明 UTF-8,浏览器按默认编码解析」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。连接字符集设成 latin1,读出来时中文已经损坏。另一种情况是回显前做了两次转义,实体被当成字符再转一遍。
少数情况下是关键词从 cookie 读取,写入时编码就丢了。
动手时先看回显的实际字节
curl -s 'https://www.lu0.cn/search?q=%E5%86%85%E5%AD%98' | grep -o '<h1>[^<]*'
随后把连接字符集统一成 utf8mb4
SET NAMES utf8mb4;
只做一次转义并在模板层统一处理
等前面都确认过,再确认页面声明了 UTF-8
curl -sI 'https://www.lu0.cn/search?q=test' | grep -i content-type
改完先别撤,确认这几项。中文关键词正常显示,问号串消失,搜索页的停留时间回到改动前的水平。
打问号是典型的字符集断层,回溯链路里谁按 latin1 读了一次,问题就出在那一段。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
