―Servlet/JSPリファレンス―

@ITハイブックス編
2003/10/24
Javaプログラミング
ワンポイントレクチャーについて

   文字コードの扱い

   ワンポイントQuestion

 クライアントから送信されてきたデータの文字コードを指定するメソッドは、次のうちどれですか? ただし、選択肢のメソッドの引数は便宜上省略してあります。(単一選択)

A setCharSet()
B setCharacter()
C setCharacterEncoding()
D setContentType()
E setContentType()

   解説

 サーブレットのサービス処理の中では、クライアントから受け取るデータやクライアントへ返すデータを扱いますが、明示的に文字コードを指定しないと文字化けを起こす場合があるので注意が必要です。

(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>
<HEAD><TITLE>InputInfo.html</TITLE></HEAD>
<BODY>
<FORM method="post" action="/j2ee/CharsetServlet">
<INPUT type="text" name="info" size="20">
<INPUT type="submit" value="送信">
</FORM>
</BODY>
</HTML>

 上記のHTMLを出力するサーブレットコード(doPostの抜粋)は以下のようになります。

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
1: req.setCharacterEncoding("Shift_JIS");
2: String infomation = req.getParameter("info");

3: resp.setContentType("text/html;charset=Shift_JIS");
4: PrintWriter out = resp.getWriter();
5: out.println("<BR>");
6: out.println("入力した情報");
7: out.println(infomation);
}

 次にサーブレットコードの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編−

本記事は@ITハイブックスシリーズ「J2EEラーニングブック −Web Component Developer編−」(技術評論社)から、一部の内容を編集し転載したものです。本書の詳細は「@ITハイブックス」サイトでご覧いただけます。

 

Javaプログラミング・ワンポイントレクチャー INDEX





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間