これは、サーブレットでは(穏やかに言えば)イライラします。標準のURLエンコーディングではUTF-8を使用する必要がありますが、サーブレットはデフォルトでISO-8859-1に設定されているだけでなく、コードでこれを変更する方法も提供していません。
確かにreq.setRequestEncoding("UTF-8")
、何かを読む前にできますが、なんらかの不敬虔な理由で、これはリクエストの本文にのみ影響し、クエリ文字列パラメータには影響しません。サーブレット要求インターフェースには、クエリ文字列パラメータに使用されるエンコーディングを指定するものはありません。
フォームでの使用ISO-8859-1
はハックです。この古いエンコーディングを使用すると、確実に解決するよりも多くの問題が発生します。特にブラウザはISO-8859-1をサポートしておらず、常にWindows-1252として扱います。サーブレットはISO-8859-1をISO-8859-1として扱うのに対し、これを使用すると、信じられないほど失敗します。
たとえば、Tomcatでこれを変更するには、要素のURIEncoding
属性を使用できます。<connector>
<connector ... URIEncoding="UTF-8" ... />
これらの設定を持つコンテナを使用しない場合、設定を変更できない場合、またはその他の問題がある場合でも、ISO-8859-1デコードは元のバイナリからの完全な情報を保持するため、コンテナを機能させることができます。
String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")
たとえばtest=ä
、すべてが正しく設定されている場合、ブラウザはそれをとしてエンコードしtest=%C3%A4
ます。サーブレットはそれをISO-8859-1として誤ってデコードし、結果の文字列を提供します"ä"
。ä
修正を適用すると、元に戻すことができます。
System.out.println(new String("ä".getBytes("ISO-8859-1"), "UTF-8").equals("ä"));
//true