Telegram 里分享链接,预览标题显示成 %E5%88%86%E4%BA%AB,十几个百分号连在一起,正文描述却显示正常。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
const u = new URL('https://t.me/share/url');
u.searchParams.set('url', pageUrl);
u.searchParams.set('text', title); // 只编码一次
分享链接是手工拼接的,标题先被 encodeURIComponent 编了一次,写进 og:title 前又编了一次,抓取端拿到的是双重编码。描述走模板输出,没有被再编一次。这一点先确认清楚,后面就不用反复试。
「Telegram 预览乱码」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,确认 og:title 输出的是原文 不做 URL 编码;分享参数只编码一次 用 URLSearchParams 生成;已经发出去的旧链接加跳转 重新生成一份。
改完照着核一遍,Telegram 预览标题显示中文原文,百分号串消失。
