Sat, February 14, 2009
サーブレットで文字化けを防ぐために文字エンコーディングを指定するポイント(java,servlet)
サーブレットで出力したHTMLが文字化けしてしまう、ということがあります。 そんなときのチェックポイントのまとめ。
Hello World サーブレット
サンプルとなるサーブレット.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8"); // 1)
PrintWriter pw=response.getWriter(); // 3)
pw.println("<html>");
pw.println("<head>");
pw.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"); // 2)
pw.println("</head>");
pw.println("<body>");
pw.println("Hello World.");
pw.println("</body>");
pw.println("</html>");
}
}
1) setContentType指定
response.setContentType("text/html; charset=UTF-8");
※ response は HttpServletResponse クラスのインスタンスです。
2) サーブレットで出力するHTMLのhead内のmetaタグ指定
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
3) response.getWriter() を使う
HTML文字列の出力に response.getOutputStream()を使わないこと。 必ず response.getWriter()を使う。
※ response は HttpServletResponse クラスのインスタンスです。
ちなみに、デフォルトで、getWriter()で得た Writer インスタンスは、 UTF-8になっていると思われる。(tomcatなどではそのようです。)
別のエンコーディングを使いたい場合はどうするのか? たぶん、
- どこか適切な方法で文字エンコーディングをサーブレットコンテナに対して設定する
- new PrintWriter( new OutputStreamWriter( response.getOutputStream(),"Shift_JIS" ) のようにする
...のではないか。
サーブレットで、CGIを使う場合
request.getParameter()する前にエンコード指定する 。
request.setCharacterEncoding("UTF-8");
String foo=request.getParameter("foo");
※ request は HttpServletRequest クラスのインスタンスです。