URIEncoding
Tomcat 8 - Apache Tomcat 8 - The HTTP Connectorのパラメータの説明:
これは、%xx が URL をデコードした後に、URI バイトをデコードするために使用される文字エンコーディングを指定します。指定しない場合、org.apache.catalina.STRICT_SERVLET_COMPLIANCE システム プロパティが true に設定されていない限り、UTF-8 が使用されます。この場合、ISO-8859-1 が使用されます。
したがって、説明は Apache Tomcat 7 の説明から変更されました。 のデフォルト値はorg.apache.catalina.STRICT_SERVLET_COMPLIANCE
Apache Tomcat 8 から false です。したがって、UTF-8 は Apache Tomcat 8 の URIEncoding のデフォルト値です。つまり、Tomcat は標準 (および一般的な使用法) に従うようになりました。 )。
Tomcat 7 まで、Tomcat がデフォルトの URI エンコーディングとして ISO 8859-1 を使用した理由については、次のとおりです。
これは、Tomcat の開発者が、これがサーブレット仕様で要求されるものであると信じていたためのようです (設定の名前が STRICT_SERVLET_COMPLIANCE を示しているように)。
実際のところ、サーブレットの仕様では、どのバージョンでも URI エンコーディングについて明示的に言及していません。ただし、Content-Type
HTTP ヘッダーでエンコーディングが指定されていない場合は、POST データを ISO 8859-1 として解析する必要があることに言及していますcharset
(サーブレット仕様 V2.5、「リクエスト データ エンコーディング」)。どうやらこれは、クエリ パラメータ (および URI 全体) もデフォルトで ISO 8859-1 としてデコードする必要があることを意味すると解釈されたようです。
根本的な問題は、サーブレット仕様が URI のデコードに使用するデフォルトのエンコーディングを指定していないこと、さらにはこのエンコーディングを変更する方法を指定していないことです。これはおそらく、URI 仕様がもともと URI で非 ASCII 文字を許可していなかったためです。これは、IRI を導入することによってのみ標準化されました。2005年 1 月のRFC 3987を参照してください。したがって、すべてのサーブレット コンテナは、独自のデフォルト値とURIEncoding
Apache Tomcatなどの設定パラメータ。
これら 2 つの問題は、サーブレット仕様に対するバグとして報告されています。
いつかサーブレットの仕様が変わるかも…。少なくとも SERVLET_SPEC-146 は解決済みとしてマークされています。