Cookieの値に日本語の文字列を格納すると文字化けする - ASP.NET

Cookieの値に日本語の文字列を格納すると文字化けすることがあります。

エラーが発生するコード

ASP.NETプロジェクトを作成し、Webフォームを作成します。Webフォームで以下のコードを記述します。
CookieWrite.apsx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetCookie
{
  public partial class CookieWrite : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Cookies["name"].Value = "ABCしろくま";
      Response.Cookies["name"].Expires = DateTime.Now.AddMinutes(60);
    }
  }
}

Cookieの値を表示するWebフォームを作成します。
CookieView.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CookieView.aspx.cs" Inherits="AspNetCookie.ViewCookie" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <div>name:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
    </div>
    </form>
</body>
</html>
CookieView.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetCookie
{
  public partial class ViewCookie : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      string namestr = "";
      string valuestr = "";

      if (Request.Cookies["name"] != null) {
        namestr = Request.Cookies["name"].Value;
      }
      Label1.Text = namestr;
     }
  }
}

実行結果

プロジェクトを実行し、CookieWrite.aspxファイルをブラウザで開き、Cookieに値を書き込みます。その後CookieView.aspxファイルにアクセスすると以下の画面が表示されます。
Cookieの値が文字化けしていることが確認できます。ASCII文字(英文字)は正しく表示されていることもわかります。

原因

Cookieの値に利用できる文字はURLで利用できる文字であるため、Cookieで日本語の値を保存する際はURLエンコードをする必要があります。

修正済みコード

以下のコードに変更します。
CookieWrite.apsx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetCookie
{
  public partial class CookieWrite : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Cookies["name"].Value = HttpUtility.UrlEncode("ABCしろくま");
      Response.Cookies["name"].Expires = DateTime.Now.AddMinutes(60);
    }
  }
}
CookieView.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetCookie
{
  public partial class ViewCookie : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      string namestr = "";
      string valuestr = "";

      if (Request.Cookies["name"] != null) {
        namestr = HttpUtility.UrlDecode(Request.Cookies["name"].Value);
      }
      Label1.Text = namestr;
     }
  }
}

解説

日本語を格納する際にHttpUtility.UrlEncode()メソッドを呼び出し値をURLエンコードします。また、値を取り出した際にはHttpUtility.UrlDecode()メソッドを呼び出しURLデコードします。

実行結果

実行結果は下図です。文字化けせずに正しく表示されました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-03-02
iPentec all rights reserverd.