我最近遇到了一个特定于Firefox编码直接输入地址栏的网址的编码问题。它基本上看起来像URL的默认Firefox字符编码不是UTF-8,大多数浏览器就是这种情况。此外,看起来他们正试图根据URL的内容做出一些关于使用什么字符编码的明智决定。
例如,如果您使用'q'参数直接在地址栏中输入URL(我使用的是Firefox 3.5.5),您将获得以下结果:
对于给定的查询字符串参数,这是它在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相同,这是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问题,用户实际上很少遇到这种情况,所以对我们来说并不太关心。但是,我碰巧注意到Google实际上处理得非常好。使用查询字符串参数的不同编码形式键入以下URL将在Google中返回不错的结果:
http://www.google.com/search?q=Knji%C5%BEevni
http://www.google.com/search?q=Knji%9Eevni
所以我的问题是,您认为他们如何处理这种情况?此外,还有其他人看到同样奇怪的Firefox行为吗?
答案 0 :(得分:2)
看起来它正在使用latin-1,除非在该编码中无法表示任何字符,否则它使用的是UTF-8。
如果情况确实如此,那么在另一端解决这个问题的方法是假设您收到的所有内容都是UTF-8,并将其验证为UTF-8。如果验证失败为UTF-8,则认为它是latin-1(iso-8859-1)。
由于UTF-8的结构方式,当验证为UTF-8时,实际上不是UTF-8的东西极不可能通过。
尽管如此,这种可能性仍存在,我认为Firefox的行为并不是一个好主意,但毫无疑问他们已经将其作为一种妥协 - 就像与服务器的兼容性一样,如果他们介入它就不会知道UTF-8
答案 1 :(得分:0)
网址中有几个部分。域名根据IDN(国际域名)规则(http://en.wikipedia.org/wiki/Internationalized_domain_name)进行编码。
您关心的部分(通常)来自表单。并且源页面的编码确定编码(在%转义之前)。 html中的表单元素也可以采用覆盖页面设置的编码属性。
所以这不是Firefox的错,引用者页面/表单的编码是决定因素。这是标准行为。