Java Webアプリ開発における文字化け対策 - 概要

2009/03/24 17:13Update
TAGS: Java | Web | 文字化け | 文字コード | SetCharacterEncodingFilter | contentType | pageEncoding

Java Webアプリ開発における文字化け対策について学びます。

Java Webアプリケーションの構成


◇ ビュー:HTML/JSP/Servlet
◇ ビジネスロジック:普通のJavaクラス
◇ データベース

目標


1、画面の表示が文字化けをしない
2、データベースに保存したデータが文字化けをしない

データのやり取り


1、データの更新や保存:フォームデータ(ユーザ入力)→Java Servlet→Javaアプリケーション→データベース
2、データの表示:データベースデータ → Javaアプリケーション → JSP/HTML → ブラウザー

基本的には、データのやり取りでの「1、データの更新や保存」と「2、データの表示」のところで、きちんと文字コードを統一・制御しておけば、文字化けが起きないと思われます。

◆◆文字化けの解決策◆◆

1、Filterでフォーム入力のエンコード処理


入力した文字のエンコード処理を行うには、Tomcatのサンプルアプリとして提供されているSetCharacterEncodingFilter.classを利用します。

また、SetCharacterEncodingFilter.javaのソースは以下のようになります。
package filters;

public class SetCharacterEncodingFilter
    implements Filter
{

    protected String encoding;
    protected FilterConfig filterConfig;
    protected boolean ignore;
    
    /**
     * Constructor
     * 
     */
    public SetCharacterEncodingFilter()
    {
        encoding = null;
        filterConfig = null;
        ignore = true;
    }

    /**
     * @see javax.servlet.Filter#destroy()
     */
    public void destroy()
    {
        encoding = null;
        filterConfig = null;
    }

    /**
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException
    {
        if(ignore || request.getCharacterEncoding() == null)
        {
            String encoding = selectEncoding(request);
            if(encoding != null)
                request.setCharacterEncoding(encoding);
        }
        chain.doFilter(request, response);
    }

    /**
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    public void init(FilterConfig filterConfig)
        throws ServletException
    {
        this.filterConfig = filterConfig;
        encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if(value == null)
            ignore = true;
        else
        if(value.equalsIgnoreCase("true"))
            ignore = true;
        else
        if(value.equalsIgnoreCase("yes"))
            ignore = true;
        else
            ignore = false;
    }

    /**
     * @param request
     * @return
     */
    protected String selectEncoding(ServletRequest request)
    {
        return encoding;
    }
}



web.xmlにSetCharacterEncodingFilterの記述を追加します。
<!-- 抜粋 -->
  <filter>
    <filter-name>EncodeFilter</filter-name>
    <filter-class>filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
    <!-- UTF-8やShift_JISなどの文字コードを適当に記入してください -->
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>EncodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


※filterの定義する順序にも細心な注意を払う必要必要があります。

2、できればデータベースにもHTMLと同じ文字コードを採用。




3、JSPの場合、ファイルの一番先頭に文字コードを指定


<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

※UTF-8に適当な文字コードを置き換えてください。

4、Servletの場合


public class MyServlet extends HttpServlet { 
  public void doGet(HttpServletRequest req, HttpServletResponse res) 
              throws ServletException, IOException {

    res.setContentType("text/html; charset=UTF-8");    //コンテンツ・タイプ
    req.setCharacterEncoding("UTF-8");    //パラメータの文字コード
    
...



5、HTMLページの<meta>タグ設定


<meta http-equiv="content-type" content="text/html; charset=UTF-8">



6、Latin 1 および Unicode 以外ネイティブコード のリソースファイルを Unicode コードに変換



Antツールを用いる場合、次のようなタスクで変換できます。
<native2ascii encoding="utf-8" src="リソースファイルのパス" dest="${classes.dir}"
                       includes="**/*.properties" />

.

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation