Tomcat 设置 URIEncoding 有什么意义?

What is the point of Tomcat's setting URIEncoding?

在 Apache Tomcat 中,参数 URIEncoding 告诉 Tomcat 如何解释传入的 URI:

URIEncoding

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

Apache Tomcat 7 - The HTTP Connector

但是,如 What is the proper way to URL encode Unicode characters? 中的示例所述,URI 中的非 ASCII 字符始终按照当前标准(RFC 3986 和 3987)以 UTF-8 编码。

所以:

这仅仅是因为 Tomcat 设置早于标准,并且为了向后兼容而保留?或者在某些情况下,不同于 UTF-8 的值有意义吗?

我看到至少对于 Tomcat 6 及以下 URIEncoding 不仅重要,而且是必要的,如果不明确将其设置为 'UTF-8',许多人会遇到问题。至于你的问题,我只能假设它是为了向后兼容。开发人员讨厌在编写代码后删除代码,即使再次需要它的可能性为零:)

Tomcat中参数URIEncoding的说明 8 - Apache Tomcat 8 - The HTTP Connector:

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.

因此描述从 Apache Tomcat 7. org.apache.catalina.STRICT_SERVLET_COMPLIANCE 默认值是 false 从 Apache Tomcat 8. 所以 UTF-8 是默认值Apache 的 URIEncoding Tomcat 8,这意味着 Tomcat 现在遵循标准(和常见用法)。


至于为什么 Tomcat 在 Tomcat 7 之前使用 ISO 8859-1 作为默认 URI 编码:

这似乎是因为 Tomcat 开发人员认为这是 Servlet 规范所要求的(如设置名称 STRICT_SERVLET_COMPLIANCE 所示)。

事实上,Servlet规范在任何版本中都没有明确提到URI编码。但是,它确实提到,如果 Content-Type HTTP header 未通过 charset(Servlet 规范 V2.1)指定编码,则 POST 数据必须解析为 ISO 8859-1。 5、“请求数据编码”)。显然,这被解释为默认情况下查询参数(以及整个 URI)也应解码为 ISO 8859-1。

根本问题可以说是 Servlet 规范没有指定用于解码 URI 的默认编码,更不用说更改此编码的方法了。这反过来可能是因为 URI 规范最初不允许 URI 中的 non-ASCII 个字符——这只是通过引入 IRI 来标准化,请参阅 2005 年 1 月的 RFC 3987。因此每个 servlet 容器都必须提出自己的默认值和配置参数,比如Apache中的URIEncodingTomcat.

这两个问题已被报告为违反 Servlet 规范的错误:

说不定有一天Servlet规范会被修改...。至少 SERVLET_SPEC-146 现在标记为已解决。