「JSP」インクルード先の JSP ファイルが文字化けする
JSP ファイルで他の JSP ファイルをインクルードした時、インクルード先の JSP ファイルの内容が
文字化けすることがある。
例えば、以下の感じ。
■ Sample.jsp
<%@ page language="java" contentType="text/html; charset=Windows-31J" %> <html> <head> <title>Sample.jsp</title> </head> <body> インクルード元 <br> <%@ include file="include.jsp"%> </body> </html>
■ include.jsp
<% String s = "インクルード先"; %> <%=s %>
Web ブラウザでみると、次のようになる。
インクルード元 ???????? ̄??≪?????????
見事にインクルード先の JSP ファイルの内容が文字化けしております。
ちょっと調べてみると、関連する情報が確認できた。
・Javaの文字化け対策FAQ(4):JSPのインクルードに関連する文字化けを解消 - @IT
http://www.atmarkit.co.jp/ait/articles/0503/12/news027.html
上記のページによると、サーブレットコンテナがインクルード先の JSP ファイルのエンコーディングを
判断できないから文字化けが起こるとのこと ( contentType 属性を定義するのは無意味だとか )。
対応としては、pageEncoding 属性を追記してやるって方法が紹介されている。
なので、次のようにインクルード先の JSP ファイルの内容を修正して、再び試してみた。
■ include.jsp
<%@ page pageEncoding="Windows-31J" %> <% String s = "インクルード先"; %> <%=s %>
ちゃんと文字化けせずに表示された。
インクルード元 インクルード先
以上です。
ちなみに、Ant のタスク JspC で Java ファイルに変換する際にもインクルード先の JSP ファイルが文字化けする。
これも pageEncoding 属性を追加することで対応が可能だった。
Ant のタスクは以下の感じですね。
<project name="JspC Sample"> <target name="target"> <property name="tomcat.home" location="/usr/local/apache-tomcat-7.0.27"/> <property name="java.home" location="/usr/local/java/jdk1.6.0_30"/> <taskdef classname="org.apache.jasper.JspC" name="jasper" > <classpath id="jspc.classpath"> <pathelement location="${java.home}/lib/tools.jar"/> <fileset dir="${tomcat.home}/bin"> <include name="*.jar"/> </fileset> <fileset dir="${tomcat.home}/lib"> <include name="*.jar"/> </fileset> </classpath> </taskdef> <jasper uriroot="." outputDir="."/> </target> </project>
[ 環境 ]
CentOS 6.2
Apache Tomcat 7.0.27
Java SE 6 Update 30
Apache Ant 1.8.4
■ 追記
今回の内容に関して、ちょっとある方からご指導いただいたので、追記します。
次の JSR-000152 に JSP ファイルのエンコーディングを判定するアルゴリズムについて記載がある。
・JavaServer Pages Specification Version2.0
JSP.D Page Encoding Detection
http://download.oracle.com/otn-pub/jcp/jsp-2.0-fr-oth-JSpec/jsp-2_0-fr-spec.pdf
詳しくは、上記の JSR を確認してほしいけど、JSP ファイルのエンコーディングは特に指定がない場合
( pageEncoding、contentType 属性など )、"ISO-8859-1" って判定されるみたい。
たしかに、インクルード先の JSP ファイルで以下のように pageEncoding 属性指定しても、同様の文字化け
が発生する。
■ include.jsp
<%@ page pageEncoding="ISO-8859-1" %> <% String s = "インクルード先"; %> <%=s %>
文字化けの原因はこういうことだったんですね。
やっぱり JSR とか「仕様書を確認してみる」って大事なことだと感じた。