Javaプログラミング/サーバサイド&ケータイJava

クッキーをマスターしよう(5ページ目)

ブラウザに保存できる情報「クッキー」をJSP/サーブレットから利用してみましょう。

執筆者:掌田 津耶乃

クッキーで日本語を使うには?


さて、実際にクッキーにさまざまな情報を保管してみると、ちょっと困ったことに気がつきます。それは「日本語が保管できない」という問題です。送信されたフォームは、ちゃんと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エンコードしてクッキーに保管し、再びデコードして取り出す、という処理ができるようになりました。日本語が扱えるようになると、クッキーもいろいろな利用ができるようになりますね。
【編集部おすすめの購入サイト】
楽天市場で Java 関連の書籍を見るAmazon で Java 関連の書籍を見る
  • 前のページへ
  • 1
  • 3
  • 4
  • 5
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます