TomcatでUTF-8/EUC-JPを使う
作成 : 2004/12/31
Tomcatから返されるキャラクタセットの情報は、httpd.confのルートで指定したAddDefaultCharsetの値と同じになるらしい。 Directoryディレクティブの中で指定したAddDefaultCharsetは無視されるっぽい。 ついでに、metaタグも無視されるみたい。 (<---このへん、後述のSetCharacterEncodingFilterがちゃんと動作しないこともあり、自信なし...)
うちのWEBサーバはルートのAddDefaultCharsetでEUC-JP指定をしており、コンテキストパス以下はUTF-8にしたいので、なんらかの対策をしないと文字化けしてしまう。
サーブレットの場合
response.setContentTypeでキャラクタセットを指定する。 EUC-JPを使用するなら、response.setContentType("text/html; charset=EUC-JP")。 UTF-8を使用するなら、response.setContentType("text/html; charset=UTF-8")。
# HelloWorld.java
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=EUC-JP");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>");
out.println("こんにちは世界");
out.println("</p>");
out.println("</body>");
out.println("</html>");
}
}
JAVAはUTF-8で処理を行うので、それ以外のEUC-JPなどを使用する場合は、コンパイルするときに-encodingをつけること。
# javac -encoding EUC-JP -classpath .:$CATALINA_HOME/common/lib/servlet-api.jar HelloWorld.java
JSPの場合
ディレクティブでキャラクタセットを指定する。 EUC-JPを使用するなら、<%@ page contentType="text/html; charset=EUC-JP" %>。 UTF-8を使用するなら、<%@ page contentType="text/html; charset=UTF-8" %>。
# hello.jsp
<%@ page contentType="text/html; charset=EUC-JP" %>
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
<p>
<%
out.println("こんにちは世界");
%>
</p>
</body>
</html>
静的コンテンツ(HTML)の場合
workers2.propetiesファイルで、コンテキストパス以下のすべてのファイルをTomcatに渡すよう設定している場合、静的コンテンツについてもこのページの先頭に書いたようなキャラクタセット情報が返される。 HTMLのmetaタグでcharsetを指定しても無視されるので、ドキュメントルートとコンテキストパスで異なるキャラクタセットを使用したいときは注意が必要。
# workers2.properties
[uri:/hoge/*] <---すべてのファイルをTomcatに処理させる
通常はSetCharacterEncodingFilterを利用するのが常套手段のようだが、どうやってもcharsetを返してくれない。 しかたないので、web.xmlの<mime-mapping>でcharsetと拡張子の関連付けを指定した。
<!--(コンテキストパス)/WEB-INF/web.xml-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html; charset=UTF-8</mime-type>
</mime-mapping>
</web-app>
いちおう、SetCharacterEncodingFilterを利用する方法を書いておくと、$CATALINA_HOME/webapps/jsp-examples/WEB-INF/classes/filtersディレクトリにあるSetCharacterEncodingFilter.javaをコンパイルして、
# cd $CATALINA_HOME/webapps/jsp-examples/WEB-INF/classes # javac -classpath .:$CATALINA_HOME/common/lib/servlet-api.jar filters.SetCharacterEncodingFilter.java
生成されたクラスファイルを(コンテキストパス)/WEB-INF/classes/filtersディレクトリにコピーして、(コンテキストパス)/WEB-INF/web.xmlにフィルタの設定を記述するだけらしい。
<!--(コンテキストパス)/WEB-INF/web.xml-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
うむむ...