プログラミング 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


関連記事

【Javaサンプル】自動販売機を作成(Level1)

Javaの勉強用サンプルです。 テーマは自動販売機。 プログラミング初心者向けに書いています。   目次 自動販売機を題材として選んだ理由自社研修で行っている身近なもので誰でもよく知っている …

no image

prepareステートメントの挙動について調べてみた

目次 調べるきっかけ調べたコード 調べるきっかけ PHPでSQLをセキュアに記述する方法としてprepareステートメントが推奨されているが、なぜなのかがわからず、挙動を調べれば自分なりに納得のいく答 …

オブジェクト指向でじゃんけんを作ってみる

最近、プログラム自体を書いていない時間を多いので、再勉強がてら少しコードを書いてみました。 目次 何を作ったか?OOPで考慮したこと設計上の条件動作例ソースコード 何を作ったか? テーマ:じゃんけん( …

正規表現で複数の箇所を入れ替える方法

複数の特定の箇所を入れ替えるテクニックです。 目次 確認環境置換方法置換前データ正規表現置換結果解説 確認環境 Sakuraエディタ 置換方法 ここでは例として、:区切りの前後の文字列を入れ替えてみま …

no image

【MySQL】自テーブルのカラムの値を0埋めで更新する方法

構文

記載例

  UPDATE前後の値を比較 UPDATE …

SpringFramworkの良書

Javaの基本を学んだ人が、次のステップ(Frameworkでの実装)として読む本。

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