付録A.2 ブラウザとアプリケーション間の文字コード変換
ブラウザとアプリケーション間で文字コード変換をするときに使用するメソッド,およびJSPとJavaScriptの実装時の注意事項について説明します。
- 〈この項の構成〉
(1) ブラウザとアプリケーション間の文字コード変換で使用するメソッド
ブラウザを使用して送信されたクエリ文字列,POSTデータは,HttpServletRequestクラスのメソッドを使用して取得します。HttpServletRequestクラスのうち,文字コード変換に関係のあるメソッドと使用時の注意事項を示します。
(a) setCharacterEncodingメソッド
リクエストのメッセージボディで使われている文字コードを設定します。このメソッドは,getParameterメソッドや,getReaderメソッドを使って入力ストリームから読み込む前に実行されなければなりません。
(a) setCharacterEncodingメソッド
リクエストのメッセージボディ,およびGETリクエストのクエリで送信されたパラメタに使われている文字コードを設定します。このメソッドは,getParameterメソッドや,getReaderメソッドを使って入力ストリームから読み込む前に実行されなければなりません。
setCharacterEncodingメソッドで設定した文字コードが使用される範囲を次の表に示します。
メソッド |
HTMLのフォームから送信されたデータ(クエリも含む) |
左記以外のメッセージボディ |
---|---|---|
getParameter |
○ |
− |
getParameterNames |
○ |
− |
getParameterValues |
○ |
− |
getParameterMap |
○ |
− |
getInputStream |
× |
× |
getReader |
× |
△ |
getQueryString |
× |
− |
(b) getParameterメソッド
パラメタの名称を指定して,リクエストに含まれるパラメタの値を取得します。取得した値はURLデコードされ,Unicodeに変換されます。パラメタの名称やパラメタの値を取得する前に,setCharacterEncodingメソッドを用いて文字コードを指定する必要があります。指定しなかった場合,ISO-8859-1としてUnicodeに変換されます。HttpServletRequestクラスのgetParameterNamesメソッド,getParameterValuesメソッド,getParameterMapメソッドも同様です。
(c) getInputStreamメソッド
リクエストのメッセージボディに含まれているバイナリデータを読み込むためのストリームを取得します。HTMLのフォームから送信されたデータからはエンコードされたままの文字列が取得されるので,取得した文字列を適切な文字コードでデコードする必要があります
(2) JSPのファイルインクルード時の注意事項
JSPファイルのincludeディレクティブでファイルをインクルードする場合には,インクルード元となるJSPファイルでcontentType属性を使用してエンコードを指定してください。また,JSPファイルの文字コードはpageEncoding属性に指定してください。指定しない場合はインクルード先の文字が正常に表示されない場合があります。
(3) JavaScriptを使用してクエリ文字列を作成する場合の注意事項
-
JavaScriptのencodeURI関数およびencodeURIComponent関数※を使用すると,UTF-8でURLエンコードできます。この関数を用いて変換した文字列をクエリ文字列として使用してください。この場合,J2EEサーバ側でUTF-8としてUnicodeに変換すると,日本語の文字列データを取得できます。
- 注※
-
encodeURI関数とencodeURIComponent関数の相違は,「,/?:@&=+$,#」などの特殊文字を変換するかどうかです。encodeURI関数は「,/?:@&=+$,#」などの特殊文字を変換しません。
-
JavaScriptのescape関数はブラウザの種類やバージョンによって動作が異なります。escape関数で変換された文字列は,サーバ側で正常に扱えないため,escape関数を使用しないで,encodeURI関数またはencodeURIComponent関数を使用するようにしてください。