クッキーで日本語を使うには?
さて、実際にクッキーにさまざまな情報を保管してみると、ちょっと困ったことに気がつきます。それは「日本語が保管できない」という問題です。送信されたフォームは、ちゃんとsetCharacterEncodingで文字コードを指定してから取り出しているのに、なぜ日本語が化けてしまうのでしょう?
これは、実はクッキーに保管されるテキストが特別な形でエンコードされたものであるためです。クッキーの値は、「URLエンコーディング」と呼ばれる方法でエンコードされ保管される必要があります。これは、URLで使用されるキャラクタだけでテキストを表現するようにしたもので、このようにしないと(特に日本語などのテキストは)データが欠落するなどして正しく保管されないのです。
では、日本語をクッキーで保管できるように修正をしてみましょう。まずは、JSPファイルからです。これは、pageディレクティブでimport文を追加し、それからクッキーの表示処理をしているスクリプトレット部分を修正して対応します。
※追加するpageディレクティブ
<%@page import="java.net.*"%>
<%@page import="java.io.*"%>
※スクリプトレットの修正
<%
// クッキーの表示
Cookie[] cookies = request.getCookies();
if (cookies != null) {
out.println("<table border=1>");
for(int i = 0;i < cookies.length;i++) {
Cookie c = cookies[i];
String name = c.getName();
String value = c.getValue();
try {
name = URLDecoder.decode(name,"UTF-8");
value = URLDecoder.decode(value,"UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
out.println("<tr>");
out.println("<td>" + name + "</td>");
out.println("<td>" + value + "</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("<br/><br/>");
}
%>
途中で、「URLDecoder.decode」というものを使ってURLエンコードされたテキストをUTF-8にデコードしています。これは、第1引数のテキストを第2引数で指定したエンコード方式のテキストに変換するものです。例外が発生するので、tryで囲んでおく必要があります。
続いてサーブレットのほうの修正です。これは、processRequestメソッドを修正すればよいでしょう。
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// クッキーの追加
String name = request.getParameter("name");
String value = request.getParameter("value");
if (name != null && value != null) {
try {
name = URLEncoder.encode(name,"UTF-8");
value = URLEncoder.encode(value,"UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
Cookie newcookie = new Cookie(name,value);
newcookie.setMaxAge(60 * 60 * 24 * 1);
response.addCookie(newcookie);
}
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher =
context.getRequestDispatcher("/index.jsp");
dispatcher.forward(request,response);
}
修正版では、日本語のクッキーもちゃんと保管できる。 |
こちらは「URLEncoder.encode」というメソッドを使っています。これは、第1引数のテキストをURLエンコードしたものを返します。第2引数には、第1引数のテキストのエンコード方式を指定します。これもやはりtryで囲んでおく必要があります。
これで、日本語をURLエンコードしてクッキーに保管し、再びデコードして取り出す、という処理ができるようになりました。日本語が扱えるようになると、クッキーもいろいろな利用ができるようになりますね。