代码之家  ›  专栏  ›  技术社区  ›  JasonStoltz

你认为谷歌是如何处理这个编码问题的?

  •  3
  • JasonStoltz  · 技术社区  · 16 年前

    我最近遇到了一个编码问题,具体是Firefox如何对直接输入地址栏的URL进行编码。基本上看,URL的默认Firefox字符编码不是UTF-8,这是大多数浏览器的情况。此外,看起来他们正试图根据URL的内容做出一些关于使用何种字符编码的智能决策。

    对于给定的查询字符串参数,这是它在http请求中的实际编码方式:

    2) …q=-->q=%E6%BC%A2%E5%AD%97(这似乎是UTF-8编码的)
    3) …q=Knjievni-->Knji%C5%BEevni%E6%BC%A2%E5%AD%97(这似乎是UTF-8编码的。。。这很奇怪,因为请注意,值的第一部分与1相同,是iso-8859-1编码的)。

    但是,随后出现在地址栏中的URL包含该URL的解码形式,因此q参数看起来像“q=Knjievni”。现在,正如我前面提到的,如果用户按下ENTER键提交地址栏中的内容,“q=Knjievni”参数现在编码为iso-8859-1,并作为“q=Knji%9Eevni”发送到我们的服务器。问题是我们总是希望有一个UTF-8编码的URL。。。因此,当我们收到这个参数时,我们的应用程序不知道如何解释它,它可能会导致一些奇怪的结果。

    正如我之前提到的,这似乎只是Firefox的一个问题,而且很少有用户会遇到这种情况,所以我们对此并不太担心。然而,我碰巧注意到谷歌实际上很好地处理了这个问题。使用不同编码形式的查询字符串参数键入以下URL将在Google中返回良好的结果:

    http://www.google.com/search?q=Knji%C5%BEevni
    http://www.google.com/search?q=Knji%9Eevni

    所以我的问题是,你认为他们是如何处理这种情况的?此外,还有其他人看到同样奇怪的Firefox行为吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   thomasrutter    16 年前

    看起来它使用的是拉丁语-1,除非该编码中无法表示任何字符,否则它使用的是UTF-8。

    如果确实是这样,那么在另一端解决这个问题的方法是假设您收到的所有内容都是UTF-8,并将其验证为UTF-8。如果验证为UTF-8失败,则假设它是拉丁语-1(iso-8859-1)。

    由于UTF-8的结构方式,当验证为UTF-8时,实际上不是UTF-8的东西不太可能通过。

    尽管如此,这种可能性还是存在的,我认为Firefox的行为不是一个好主意,尽管毫无疑问,他们这样做是作为一种妥协——比如与服务器的兼容性,如果他们介入的话,就不会知道UTF-8。

        2
  •  0
  •   Mihai Nita    16 年前

    url中有几个部分。域名按照IDN(国际域名)规则进行编码( http://en.wikipedia.org/wiki/Internationalized_domain_name

    你关心的部分(通常)来自表单。源页的编码决定了编码(在%转义之前)。html中的表单元素还可以采用编码属性,该属性覆盖页面设置。

    推荐文章