Java Webアプリ開発における文字化け対策 - 概要
2009/03/24 17:13Update
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" />
.
Sponsored Link
Comments
- Relative Articles
- Java開発及び実行環境の構築 | Linux篇 - (2008/08/31 20:34)
- Java開発及び実行環境の構築 | Windows篇 - (2008/08/31 21:18)
- 5分でJava Hello World! - (2008/08/31 22:13)
- Java言語の制御構文 - 条件分岐if/else/else if - (2008/10/01 21:30)
- Java言語の繰り返し制御構文 - for文 - (2008/10/03 18:22)
- Java言語の繰り返し制御構文 - do ... while文 - (2008/10/03 21:23)
- Java言語の繰り返し制御構文 - while文 - (2008/10/03 21:32)
- Java言語の基礎 - javacコマンドによるコンパイル - (2008/10/10 17:58)
- Java アクセス修飾子概要 - (2008/10/29 18:31)
- Javaアノテーション機能 概要 - (2009/02/12 13:06)