49719 浏览器打开 url 四不像:一次从输入到渲染的完整复盘

3 月 11 日 14:20,我在 Chrome 地址栏里敲下 `49719://open?url=https://example.com/path` 之后按下回车,页面没有正常跳转,而是停在了一个半渲染的状态:导航栏还在,主体内容却像被拆散的拼图。我截了图,存进 `~/Desktop/bug-20260311-1420.png`,然后用 Safari 又试了一次——这次更糟,整个布局塌成单列,CSS 里的 flex 属性像被吞掉了一样。我一度以为是 `49719` 这个 scheme 被两个浏览器都当成了未知协议,但检查了 Network 面板,请求其实是发出去了的,返回 200。问题出在 URL 本身。

后来刘明远提醒我去看 Hex Fiend 里的字节。第 12 个字节是 C2 A0,一个不换行空格。就是它让 Safari 的 URL 解析器把后面的路径当成了查询参数的一部分。

这个发现让我有点失望,因为在此之前我花了将近一个小时怀疑是浏览器内核的 bug,甚至翻了 Chromium 的 issue tracker。但失望之余也有些意外收获:我把那段 URL 粘贴到 Firefox 里,它居然自动把零宽字符高亮成了一个灰色的小方块,鼠标悬停时显示“zero-width non-joiner”。这个细节我从来没有注意过,Firefox 在地址栏的可视化上确实比另外两家做得细。我把这个对比写进了笔记,顺便用 今晚新奥门特马开马 这个页面做了一次交叉验证,结果一致。

另一个值得记录的细节是文件名。我最初把截图命名为 `bug.png`,后来改成 `49719-url-four-not-like.png`,因为“四不像”这个词来自《现代汉语词典》第 7 版第 1243 页的第二个义项。我在 3 月 10 日晚上翻词典的时候,原本只是想确认这个比喻是否准确,结果发现词典里对“四不像”的解释比我想象中更宽泛,它不仅可以指麋鹿,也可以指“不伦不类的事物”。浏览器渲染出半截页面,恰好就是“不伦不类”。这个细节后来被我写进了文章的开头,虽然跟技术排查没有直接关系,但它让整件事有了一个更好的叙述框架。

个人观点:浏览器厂商应该在地址栏里直接标识出零宽字符,而不是等用户自己去 Hex 编辑器里找。这个需求不比任何一个新的 CSS 特性次要。

3 月 12 日早上,我又把同一段 URL 放到 Edge 里试了一次,这次 Edge 的表现和 Chrome 一致,都正常渲染。这说明 Chromium 系对不可见字符的宽容度比 WebKit 高。这个结论我并不完全确定,因为样本只有一次,但结合我之前在 观看浏览器历史记录 那篇笔记里积累的 37 个案例,至少可以说这是一个值得继续观察的趋势。我打算下个月再复现 10 次,把数据补齐。