ログログ

雑学エンジニアが学んだことの記録

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


関連記事

no image

XSS対策の基本は入力値制限とサニタイジング(無害化)の2つ

XSS(クロスサイトスクリプティング)の基本的な対策は何をすればいいのかがぼんやりしている方向けの書いています。 対策方法はタイトルの通り、XSS(クロスサイトスクリプティング)対策の基本は入力値制限 …

no image

【PHP】配列と連想配列と多次元配列の説明と使用例

目次 配列とは?定義例まとめ 配列とは? 1つの変数に複数の値を持つものです。 整数型や文字列型は1つの変数に1つの値を持ちますが、配列は同じようなデータの集まりを1つの変数に持つことができるようにな …

フロントエンジニアとバックエンドエンジニアのどちらになるべきか?

目次 対象読者フロントエンジニアかバックエンドエンジニアか?・役割から考える・やりたいことで考える・性格や得意なことで考える各々の今後のスキル目標どっちもやりたい場合どれくらい稼げるか?・フロントエン …

Laravelのヘルパー関数とは?

Laravel includes a variety of global “helper” PHP functions. Many of these functions are …

no image

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

構文

記載例

  UPDATE前後の値を比較 UPDATE …