一尘不染

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

tomcat

在我尝试提供帮助的网站上,用户可以在浏览器中输入网址,例如跟随中文字符,

  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。受支持的浏览器是IE 6 +,Firefox 2+和iPhone上的Safari。


阅读 269

收藏
2020-06-16

共1个答案

一尘不染

不幸的是,UTF-8编码是URI规范中的“应该”
,它似乎假定原始服务器将以对目的地服务器有意义的方式生成所有URL。

我会考虑几种技术。所有这些都涉及到您自己解析查询字符串(尽管您可能比我更了解设置请求编码是影响查询字符串到参数映射还是仅影响主体)。

首先,检查查询字符串中是否有单个“高字节”:有效的UTF-8序列必须具有两个或多个字节(Wikipedia条目具有有效和无效字节的漂亮表)。

不太可靠的方法是在请求中查找“ Accept-
Charset”标头。我不认为此标头是必需的(没有查看HTTP规范进行验证),而且我知道Firefox至少会发送完整的可接受值列表。选择列表中的第一个值可能会起作用,也可能不会。

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

2020-06-16