検索

キーワード


【Java】サーブレットでのエンコーディング指定

  • 公開日:2020-10-29 18:01:42
  • 最終更新日:2020-11-13 21:38:41
【Java】サーブレットでのエンコーディング指定

こんにちは。エンジニアの新田です!
ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。
今回は、サーブレットでのエンコーディング指定について解説します。エンコードの設定に誤りがあると文字化けが発生する原因になりますので、しっかり理解しておきましょう。

関連記事:【Java】Webアプリケーションとは? 【Java】サーブレット(Java Servlet)


エンコードって何?

ここでは、サーブレットで扱う文字エンコードを対象に説明します。

文字エンコードとは、「UTF-8」や「Shift-JIS」のように、文字コード体系を指すものです。クライアント側で表示するHTMLやサーバー側で管理しているデータベースにも文字エンコードが指定されており、クライアントやデータベースとの間で処理を行うサーブレットは文字エンコードを意識して実装する必要があります。


文字エンコードには以下のようなものがあります。

文字エンコード



サーブレットでのエンコーディング指定

Javaはデフォルトで内部処理をUnicodeベースで行なうのに対し、クライアントから送信されてくるリクエストは、Shift-JISやEUC-JPのような文字エンコードです(HTMLで指定されている文字エンコード)。

このとき、サーブレット側で自動で文字コードの変換は行われないため、何もしなければ文字コードの不整合が発生し、文字化けが発生する原因となります。

そこで、リクエストデータにマルチバイト文字が含まれている可能性がある場合は、意図的にリクエストデータで使用されている文字エンコードを指定する必要があります。

今回は、サーブレットで文字エンコード指定を考慮する必要があるポイントとして、以下の2点について説明します。


出力時のエンコーディング指定

Javaサーブレットでは以下の2つの方法で出力時のエンコーディング指定が可能です。

※何れの場合も実行の順番に注意。必ずgetWriterメソッドの前に実行すること。


1.responseオブジェクトのsetCharacterEncodingメソッドで文字コードを指定する。

response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();


2.responseオブジェクトのsetContentTypeメソッドで 文字コードを指定する。

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

引数にコンテントタイプを表す文字列を指定("{MIMEタイプ指定};charset={エンコーディング指定}")

※MIMEタイプとは、Web上でやり取りされるデータの種類のこと。

MIMEタイプ



リクエストパラメータ取得時のエンコーディング変換

Javaサーブレットでは以下の方法でリクエストパラメータ取得時のエンコーディング指定が可能です。

※実行の順番に注意。必ずgetParameterメソッドの前に実行すること。

request.setCharacterEncoding("UTF-8");
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");

※リクエストパラメータが複数の場合は初めに一度だけ実行すればよい。



フィルタを使ったエンコーディング指定

Javaサーブレットのフィルタ機能を使って、エンコーディングを一括して指定することができます。

フィルタとはサーブレットがリクエストを受け取る前、サーブレットがレスポンスを返した後に何らかの処理を挟むことができる機能です。


フィルタはeclipseのウィザードを使うことで簡単に作ることができます。設定内容等の詳細についてはフィルタ機能の記事で紹介します。


実際のコードサンプルを紹介しますが、サーブレットに処理を渡す前に、以下のように処理を挟むことができます。ここではrequestと responseにそれぞれエンコーディングを指定しています。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");
    // pass the request along the filter chain
    chain.doFilter(request, response);
}



これにより、実際のサーブレット側ではその都度エンコーディングの指定をする必要がなくなります。




今回紹介したのは、リクエストデータ受け取りと、レスポンスデータ出力でのエンコーディング指定でしたが、実際のシステムではデータベースやサーバー上のファイルなど様々な場所で文字エンコードが指定されています。文字エンコーディングがどのようなものなのか、なぜ文字化けが発生するのかを理解しておきましょう。



関連記事:【Java】Webアプリケーションとは? 【Java】サーブレット(Java Servlet)




【著者】

新田

JavaメインのWebアプリケーション開発に多く携わっています。
Javaの基本的な部分の紹介や、これまで経験したシステム開発手法、新しい技術についても紹介していこうと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様