TOPサーバ構築・運用> 入力文字コードの宣言は必須
はじめてのサーバサイドJava
はじめてのサーバサイドJava

第7回:リクエストデータの利用(後編)

著者:山田 祥寛   2006/4/28
前のページ  1  2  3  次のページ
入力文字コードの宣言は必須

   フォームからの入力に日本語などのマルチバイト文字が含まれる場合には、必ずタグで文字コードを宣言する必要があります(リスト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>タグによる入力文字コードが使用されます。

前のページ  1  2  3  次のページ


WINGSプロジェクト  山田 祥寛
著者プロフィール
有限会社WINGSプロジェクト   山田 祥寛
Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト(http://www.wings.msn.to/)」の代表。主な著書に「10日でおぼえる入門教室シリーズ(Jakarta・JSP/サーブレット・PHP・XML)」(以上、翔泳社)、「書き込み式 SQLのドリル」(ソシム)など。最近ではIT関連技術の取材、講演まで広くを手がける毎日。

INDEX
第7回:リクエストデータの利用(後編)
  リクエストデータの利用
入力文字コードの宣言は必須
  ヘッダ情報による制御