―Servlet/JSPリファレンス―
2003/10/24
文字コードの扱い |
ワンポイントQuestion |
クライアントから送信されてきたデータの文字コードを指定するメソッドは、次のうちどれですか? ただし、選択肢のメソッドの引数は便宜上省略してあります。(単一選択)
|
解説 |
サーブレットのサービス処理の中では、クライアントから受け取るデータやクライアントへ返すデータを扱いますが、明示的に文字コードを指定しないと文字化けを起こす場合があるので注意が必要です。
(1)クライアントから受け取るデータ
サービスメソッドの第1引数で受け取るHttpServletRequestのsetCharacterEncoding()を使用してクライアントから受け取るデータの文字コードを指定します。
void setCharacterEncoding(String code) 引数に文字コードを指定します。getParameter()などでHTTPパラメータを読み込む前にこのメソッドを呼び出す必要があります。 |
また関連するメソッドとしては、String getCharacterEncoding()があります。
(2)クライアントへ返すデータ
サービスメソッドの第2引数で受け取るHttpServletResponseのsetContentType()を使用してクライアントへ返すデータの文字コードを指定します。
void setContentType(String type) 引数にMIME形式と合わせて文字コードを指定します。getWriter()よりも前にこのメソッドを呼び出す必要があります。 |
また関連するメソッドとしては、String getCharacterEncoding()があります。では、具体例を通して見てみましょう。まずは、文字化けが起きない例です。
文字化けテスト用入力 |
上の画面のように任意の入力をします。ボタンをクリックするとサーブレットに処理が渡り結果が表示されますが、文字化けを起さず期待どおりの結果が以下のように表示されます。
文字化けテスト用結果1 |
以下にソースコードを記します。
<HTML> |
上記のHTMLを出力するサーブレットコード(doPostの抜粋)は以下のようになります。
public void doPost(HttpServletRequest
req, HttpServletResponse resp)
|
次にサーブレットコードの3行目、setContentType()呼び出しをコメントアウトして同様に実行してみます。
文字化けテスト用結果2 |
見事に文字化けしているのが分かると思います。setContentType()を指定しなかったために、表示しようとしたすべての文字が文字化けしてしまいました。
最後の例として、setContentType()を元どおりにして、さらに(1)行目のsetCharacterEncoding()だけをコメントアウトしてみると、どのように変わるでしょうか? 結果は、以下のようになります。
文字化けテスト用結果3 |
つまり、クライアントから送信されたデータを受け取る文字コードが指定されていなかったため、クライアントで入力した情報のみが文字化けを起してしまったという症状ですが、setContentType()が指定されているので、「入力した情報」という文字は文字化けしないで表示されています。
前記例でsetCharacterEncoding()とsetContentType()の使い方が理解できたと思います。問題では、「クライアントから送信されてきたデータの文字コードを指定するメソッド」とありますので、選択肢CのsetCharacterEncoding() が正解となります。選択肢DのsetContentType() は解説にあるとおりクライアントへ返すデータの文字コードを指定するメソッドです。ほかの選択肢のメソッドは存在しません。
POINT |
・サーブレットAPI2.3より、setCharacterEncoding()を使用してクライアントから受け取るデータの文字コード指定を明示的にする必要があります。 ・setCharacterEncoding()は、getParameter()などでHTTPパラメータを読み込む前にこのメソッドを呼び出す必要があります。 ・setContentType()は、getWriter()よりも前にこのメソッドを呼び出す必要があります。 ・setCharacterEncoding()、setContentType()はどちらも文字コードを指定するためのメソッドですが、setCharacterEncoding() は引数に文字コードのみを指定するのに対して、setContentType() は引数にMIME形式とともに文字コードを指定します。 ・日本語を扱う場合、本節で説明した2つのメソッド 「setCharacterEncoding()」「setContentType()」は必須となりますので、必ず覚えるようにしてください。 |
KEYWORD |
■ssetCharcterEncoding() クライアントから受け取るデータの文字コードを指定するメソッドです。 ■setContentType() クライアントへ送信するデータの文字コードを指定するメソッドです。 |
ワンポイントQuestionの解答 |
正解 C
Java2ラーニングブック
−Web Component Developer編−
|
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|