読者です 読者をやめる 読者になる 読者になる

「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 とか「仕様書を確認してみる」って大事なことだと感じた。