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