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

Firefox 你认为谷歌是如何处理这个编码问题的?,firefox,encoding,utf-8,Firefox,Encoding,Utf 8,我最近遇到了一个编码问题,具体是Firefox如何对直接输入地址栏的URL进行编码。基本上看,URL的默认Firefox字符编码不是UTF-8,这是大多数浏览器的情况。此外,看起来他们正试图根据URL的内容做出一些关于使用何种字符编码的智能决策 例如,如果您直接在地址栏(我使用的是Firefox 3.5.5)中输入带有“q”参数的URL,您将得到以下结果: 对于给定的查询字符串参数,这是它在http请求中的实际编码方式: 1) …q=Književni-->q=Knji%9Eevni(这似乎是i

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

例如,如果您直接在地址栏(我使用的是Firefox 3.5.5)中输入带有“q”参数的URL,您将得到以下结果:

对于给定的查询字符串参数,这是它在http请求中的实际编码方式:
1) …q=Književni-->q=Knji%9Eevni(这似乎是iso-8859-1编码的)
2) …q=漢字 --> q=%E6%BC%A2%E5%AD%97(这似乎是UTF-8编码的)
3) …q=Književni漢字 --> Knji%C5%BEevni%E6%BC%A2%E5%AD%97(这似乎是UTF-8编码的…这很奇怪,因为请注意,值的第一部分与1相同,1是iso-8859-1编码的)

所以,这真的没什么大不了的,对吧?嗯,对我来说,不是全部,但有点。在我正在开发的应用程序中,我们的全局导航中有一个搜索框。当用户在我们的搜索框中提交搜索词时,“q”参数(如我们的示例中,保存查询字符串值的参数)会在请求时提交,并经过UTF-8编码,一切正常

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

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



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

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

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

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


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

url中有几个部分。域名根据IDN(国际域名)规则()进行编码

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


所以这不是Firefox的错,参考页面/表单的编码是决定因素。这是标准行为。

问题是,当我以表单形式提交它时,它是用UTF-8编码的,正如您所说的那样。我的问题是,当响应返回并呈现页面时,查询字符串参数实际上以未编码状态出现在地址栏中。。。“q=Književni”。然后,当我在地址栏上显式按enter键并输入URL时,看起来该URL与当前页面(以及该页面的源代码)没有关联,因此它似乎试图使用iso-8859-1编码。是的,这是一种奇怪的行为。IE(8)和Chrome似乎总是将我上面使用的URL编码为UTF-8。。。所以我猜也许UTF-8编码实际上是他们的默认编码。但是,是的,我希望有一个更容易的解决办法,但看起来可能不是这样。现在,困难的部分将是准确地确定如何验证UTF-8编码(在Java中):/谢谢您的帮助!看起来Bugzilla中实际上有一些报告的bug代表了这个问题,我对Java了解不多,但根据Wikipedia,InputStreamReader和OutputStreamWriter类支持本机UTF-8。你告诉它在构造函数中解释为UTF-8,然后假设如果你得到一个异常,你会捕获它(并尝试另一种编码)。@thomasrutter有趣的想法,听起来应该可以工作。也许我会试一试。谢谢你。@thomasrutter事实上,我在想我也许可以用URL解码器做类似的事情。这可能更合适。