タグで文字コードを宣言する必要があります(リスト1の3)。
<fmt:requestEncoding>タグの宣言は、先述した@pageディレクティヴのcontentType属性やpageEncoding属性による宣言とは異なりますので、それぞれを混同しないようにしてください(表2)。一般的に、クライアント(ブラウザ)はサーバからの出力文字コードと等しいコードでフォーム情報を送信します。したがって、本稿の設定の場合"Windows-31J"を設定すべきです(注2)。
属性/タグ |
対象 |
contentType属性(@page) |
ページの「出力」文字コード |
pageEncoding属性(@page) |
JSPファイルの「記述」文字コード |
<fmt:requestEncoding>タグ |
フォームからの「入力」文字コード |
表2:文字コードに関する主要な宣言
※注2:
"JISAutoDetect"を指定することで、文字コードを自動判定することもできますが、これは誤判断を招く可能性があります。原則として、明示的に特定の文字コードを宣言することを強くお勧めします。
ただし、(ここが難しいのですが)「クエリ情報」経由で送信された情報の文字コード解釈は「コンテナ依存」となるので、注意してください。例えば、Tomcat 5.x環境ではマルチバイト文字を含むクエリ情報を送信した場合、文字化けしてしまいます(図2)。

図2:文字化けしたマルチバイト文字
(画像をクリックすると別ウィンドウに拡大図を表示します)
これを防ぐためには、%CATALINA_HOME%/conf/server.xmlのconnector属性をリスト2のように編集してください(このリストは、TomcatとApacheを連携している場合の例です。Tomcat単体で動作している場合には、ポート8080の<Connector>要素を変更してください)。
リスト2:クエリ情報のマルチバイト対応(server.xml)
<Connector port="8009"
enableLookups="false"redirectPort="8443" protocol="AJP/1.3"
useBodyEncodingForURI="true" />
これによって、<fmt:requestEncoding>タグで指定された文字コードがクエリ情報にも適用されるようになります。ただし、この設定はコンテナに依存するものです(注3)。詳細については、使用しているコンテナのドキュメントなどを参照してください。
※注3:
例えば、同じTomcatでも4.xにはuseBodyEncodingForURI属性はありません。デフォルトで<fmt:requestEncoding>タグによる入力文字コードが使用されます。