TomcatでUTF-8/EUCを使う

Sep | OCT | Nov
| 03 |
2016 | 2018 | 2019

success
fail
About this capture
COLLECTED BY
Organization: Alexa Crawls
Starting in 1996, Alexa Internet has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to the Wayback Machine after an embargo period.
Collection: Alexa Crawls
Starting in 1996, Alexa Internet has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to the Wayback Machine after an embargo period.
TIMESTAMPS
The Wayback Machine - https://web.archive.org/web/20181003202907/http://www.nina.jp:80/server/slackware/webapp/tomcat_charset.html

TomcatでUTF-8/EUC-JPを使う

[サーバの実験室 Slackware]

作成 : 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>

うむむ...

[サーバの実験室 Slackware]