const raw = new URLSearchParams(location.search).get('q') || '';
let kw = raw.replace(/\+/g, ' ');
try { kw = decodeURIComponent(kw); } catch (e) {}
gtag('event', 'search', { search_term: kw });
站内搜索页的关键词直接从 location.search 取,上报后在报表里显示成 %E5%85%B3%E9%94%AE%E8%AF%8D,中文一个都认不出来。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,URL 查询参数是百分号编码的,没经过 decodeURIComponent 就当成明文写入,报表里自然是一串转义字符。加号在查询串里代表空格,也需要单独还原。
「搜索词 URL 编码」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:取到参数后先 decodeURIComponent,再把加号替换成空格;解码失败时兜底用原始值,别让整个事件报错;上报前在调试视图确认中文正常显示。
改完只确认一件事:报表里搜索词显示为正常中文,零结果词和热门词都能直接读出来。
