pageEncodingとcontentTypeのcharsetは処理されるタイミングが異なります。
それによって文字化けの原因につながっているので、どのように設定すればいいかを解説していきます。
違いは処理のタイミング
pageEncoding
・JSPファイルからServletを生成する際の文字コード
・JSPは内部的にはjavaファイル(Servlet)に変換されて、
out.writeメソッドでHTML出力されます。
(例)?がUTF-8でエンコードされて出力されている。
↓
1 2 3 4 5 6 7 8 9 |
out.write("<!DOCTYPE html>\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<title>Insert title here</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("?\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n"); |
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
コメント