プログラミング Java

pageEncodingとcontentTypeのcharsetの違い

投稿日:

pageEncodingとcontentTypeのcharsetは処理されるタイミングが異なります。
それによって文字化けの原因につながっているので、どのように設定すればいいかを解説していきます。

違いは処理のタイミング

pageEncoding

JSPファイルからServletを生成する際の文字コード
・JSPは内部的にはjavaファイル(Servlet)に変換されて、
out.writeメソッドでHTML出力されます。
(例)🍔がUTF-8でエンコードされて出力されている。

Javaファイル出力先
[Eclipseのルートディレクトリ]\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\[プロジェクト名]\org\apache\jsp

出力ファイル名
[JSPファイル名]_jsp.java

 

contentType

ブラウザが解釈する際の文字コード
・レスポンスヘッダーに設定される文字コードとなるため、ブラウザ上での文字コード設定になります。

 

処理の順番

アプリケーションサーバ側で、JSPがServletに変換される。(pageEncoding)

ブラウザからJSPへアクセスする(リクエスト)

ブラウザにJSPの画面が表示される(レスポンス)(contentType)

 

検証データ

🍔
文字コードがUTF-8で表示される絵文字(Shift_JISだと文字化けするもの)
これがどの設定パターンだと文字化けしないか検証しました。

 

検証ケース

OK:pageEncoding=”UTF-8″, contentType charset=”UTF-8″

JSPから変換されたServlet:🍔
ブラウザの表示:🍔
もちろんこれはOKなケース

NG:pageEncoding=”UTF-8″, contentType charset=”Shift_JIS”

JSPから変換されたServlet:🍔
ブラウザの表示:?
これはブラウザの文字コードを、手動でShift_JISからUTF-8に変換すればよいと思ったのですがNG(?のまま変化しません)でした。

NG:pageEncoding=”Shift_JIS”, contentType charset=”Shift_JIS”

JSPから変換されたServlet:�沚�
ブラウザの表示:?沚?
もちろんこれはNG

NG:pageEncoding=”Shift_JIS”, contentType charset=”UTF-8″

JSPから変換されたServlet:�沚�
ブラウザの表示:?沚?
もちろんこれもNG
Shift_JISでエンコードされた時点で、�沚�のように化けてしまっているので、
これをあとからUTF-8にしてもダメなためです。
補足情報に🍔を文字コードに変換したものを掲載いたしますので、ご確認ください。

 

まとめ

pageEncodingとcontentTypeのcharsetが異なると文字化けの原因になるため、
2つはそろえるようにする。

 

補足情報

contentTypeの設定

・pageEncodingで文字コードの指定がなければ優先される
・HTMLのmetaタグにあるcharsetよりも優先される

%xx形式の🍔

🍔を%xx形式で変換すると以下の文字コードになります。

 

参考サイト

Javaの道:文字化け対策
http://www.javaroad.jp/servletjsp/sj_servlet13.htm

JSPが文字化けしたときの対処法
https://qiita.com/d-yosh/items/c04e0e686f7dc75a8529

文字コード変換
https://www.marbacka.net/msearch/tool.php#str2enc

-プログラミング, Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

ModelからBindingResultが消える原因と対処方法

環境 Java(SpringFramework) Thymeleaf 状況 更新画面でバリデーションエラーにより更新が失敗したというようなケースにおいて、 BuindingResultにFormのエラ …

【Java】HashSetの使い方(順序なしSet)

HashSetの使い方をまとめました。 HashSetに関する使い方のサイトは他にもありますが、 それらのサイトには書かれていないメソッドについても書いてあります。 HashSetの基本情報 ・重複す …

【JdbcTemplate】Queryの書き方(SELECT文)

JdbcTemplateでQueryを書く方法です! (SELECT文で、1件・複数件を取得するケース)   前提 以下のテーブル(users)を持ち、格納するのはUserクラスという想定で …

【SpringBootチュートリアル】#11~ 削除ダイアログの作成

概要 検索結果から削除機能を呼び出した際に、削除を確認するためのダイアログです。 実装はjQueryで行いますので、mavenへの追加作業等の準備を別途行います。 イメージ jQueryの準備 jQu …

【Java】TDDして汎用的な部品を作成する(日付期間オブジェクト)

目的 TDDブートキャンプというセミナーに参加して面白かったので、 自分で何かやってみようと思った。 仕様 日付期間を保持するオブジェクトである。 開始日と終了日を持つ。 開始日と終了日を持つことをど …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。