2.4 日本語の表示とコンテンツタイプについて

2.4 日本語の表示とコンテンツタイプについて

これまでのプログラムでは、リクエストを受けて処理した結果の文字列を画面に表示していましたが、これは下の図のような流れで行われています。

文字列は、そのままの状態でブラウザに送られているわけではなく、特定のデータに変換されてブラウザ側に送信されています。

2.4.1 日本語を表示する時の注意

レスポンス、つまり画面に表示するデータに日本語を含めるときは、少し注意が必要です。
例えば「日本語を表示するservlet!」というメッセージを画面に出力させる際に、日本語の部分が「譌・譛ャ隱槭r陦ィ遉コ縺吶k」と表示されてしまうことがあります。
このように、表示させようとした文字が別の文字として表示されてしまうことを「文字化け」と呼びます。
ブラウザに日本語を正常に表示させるためには、「コンテンツタイプ」の設定を行い文字コードの指定をする必要があります。
JavaのWebアプリケーションでは、文字コードが設定されていない場合、デフォルト文字コードの「ISO-8859-1(Latin1)」が設定されているものとして画面の出力が行われます。「ISO-8859-1(Latin1)」は西欧系の言語ですので、日本語に対応していません。その結果、日本語の部分が「譌・譛ャ隱槭r陦ィ遉コ縺吶k」と表示されてしまうことがあります。

2.4.2 コンテンツタイプとは

コンテンツタイプとは、Webブラウザ側に返すファイルやデータの種類を指定する設定です。
Webブラウザからのリクエストの結果として返すファイルの種類をコンテンツタイプに設定することで、ファイルの種類をWebブラウザ側が知ることができます。そして、その種類に応じて、画面にそのまま表示したり、ファイルとして保存したり、他のアプリケーションを起動して表示したりと、動きを変えることができるのです。

コンテンツタイプは、以下の書式でコントローラー内の処理の初めに定義します。

書式:コンテンツタイプ

response.setContentType("MIMEタイプ; 文字エンコーディング");

凡例:コンテンツタイプ

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

変数responseは、jakarta.servlet.http.HttpServletResponseインタフェースのオブジェクトです。
このコンテンツタイプを設定するsetContentType()メソッドの引数には「MIMEタイプ」と「文字エンコーディング」を指定することができます。

コンテンツタイプの別の書き方

本テキストではsetContentType()メソッドにMIMEタイプと文字エンコーディングを一緒に指定していますが、別々に記述することも可能です。その場合は、setContentType()メソッドの他に、setCharacterEncoding()メソッドもあわせて記述します。

MIMEタイプ

MIMEタイプとは、インターネット上でのデータの種類のことを表すもので、主なMIMEタイプには以下通りです。

文字エンコーディング

文字エンコーディングとは、ブラウザに表示する文字のエンコードの種類のことです。
サーブレットからブラウザに文字列を送る場合、Webサーバーでエンコード(符号化)と呼ばれる処理が行われ、データがブラウザに送られます。また、ブラウザではデコード(復号化)と呼ばれる処理を行い画面に表示します。

エンコード:文字列を指定された文字コードのデータに変換する。
デコード:文字コードのデータを元の文字列に変換する。

このエンコードとデコードの処理は次の図のような流れで行われます。

日本語を扱う場合は、指定された文字セットが日本語に対応していないと、デコードの処理で問題が発生し、文字化けの原因となります。
主な文字エンコーディングには以下のようなものがありますので覚えておきましょう。


NEXT>> 2.5 MIMEタイプの違いによる出力の違いを確認しよう