在Tomcat上处理URI中的字符编码

在我试图帮助的网站上,用户可以在浏览器中输入一个URL,如下面的汉字,

http://localhost:8080?a=测试 

在服务器上,我们得到

  GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1 

如您所见,它是UTF-8编码,然后是URL编码。 我们可以通过在Tomcat中将编码设置为UTF-8来正确处理。

但是,有时我们在某些浏览器上获得Latin1编码,

  http://localhost:8080?a=ß 

变成

  GET /a=%DF HTTP/1.1 

无论如何在Tomcat中正确处理这个问题? 看起来服务器必须进行一些智能猜测。 我们不希望100%正确处理Latin1,但是通过假设一切都是UTF-8,任何东西都比我们现在做的更好。

服务器是Tomcat 5.5。 支持的浏览器是iPhone 6 +,Firefox 2+和iPhone上的Safari。

不幸的是,UTF-8编码是URI规范中的“应该”,它似乎假设源服务器将生成所有URL,使得它们对目标服务器有意义。

我会考虑几种技术; 所有这些都涉及自己解析查询字符串(尽管您可能比我知道更好的是设置请求编码是否会影响查询字符串到参数映射或仅影响正文)。

首先,检查单个“高字节”的查询字符串:有效的UTF-8序列必须有两个或更多字节( Wikipedia条目有一个很好的有效和无效字节表)。

不太可靠的是在请求中查看“Accept-Charset”标头。 我不认为这个标题是必需的(没有看过要validation的HTTP规范),我知道Firefox至少会发送一个可接受值的完整列表。 选择列表中的第一个值可能有效,或者可能没有。

最后,您是否对日志进行了任何分析,以查看特定用户代理是否会始终如一地使用此编码?