关于c# .net 使用cookie存储和传输数据中出现乱码的一些问题总结

原创 2018年04月17日 14:22:41
一、目的:中文属于Unicode编码,而英文属于Ascll编码,Cookie中又只能存储英文,要想向cookie中存取中文就要对中文进行编码。当向cookie中存储时,使用编码方法对文本进行转码。当从cookie中读取时,使用U解码方法进行解码。

二、服务器后端编码、解码及操作HttpCookie

服务器端读取客户端cookied并转码成非编码字符。假如toDealList中存放着需求读取的cookie key列,那么这就是个读取方法,会将cookie中编码过的字符解码:

        
        public HttpCookie GetSelectItem()
        {
            HttpCookie cooktime = Request.Cookies["SelectItem"];//sUrl
            List<string> toDealList = new List<string>() { "stime", "etime" };
            if (cooktime != null)
            {
                foreach (string one in toDealList)
                {
                    var stimeCook = cooktime[one];
                    if (!string.IsNullOrEmpty(stimeCook))
                    {
                        cooktime.Values.Remove(one);
                        cooktime.Values.Set(one, Server.UrlDecode(stimeCook));
                    }
                }
            }
            return cooktime;
        }

三、客户端编码与解码

js使用escape、encodeURI和encodeURIComponent三种方法进行编码,区别如下:

escape和它们不是同一类
简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。
其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。
事实上,这个方法我还没有在实际工作中用到过,所以就不多讲了。
最常用的encodeURI和encodeURIComponent
对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码  ASCII字母、数字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把 http://  编码成  http%3A%2F%2F 而encodeURI却不会。
最重要的,什么场合用什么方法
区别上面说的很清楚了,接下来从实际例子来说说把。
1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI
比如
encodeURI("http://www.cnblogs.com/season-huang/some other thing");
编码后会变为
"http://www.cnblogs.com/season-huang/some%20other%20thing";
其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为
"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
看到了区别吗,连 "/" 都被编码了,整个URL已经没法用了。
3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
var param = "http://www.cnblogs.com/season-huang/"; //param为参数
param = encodeURIComponent(param);
var url = "http://www.cnblogs.com?next=" + param;
console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"

看到了把,参数中的 "/" 可以编码,如果用encodeURI肯定要出问题,因为后面的/是需要编码的。

解码一般用decodeURI、unescape、deodeURIComponent与之相应的对应。

四、.net 中的System.Net.Cookie和System.Web.HttpCookie区别

1.System.Net.Cookie
表示客户端使用的Cookie ,可由客户端应用程序检索通过Http接收的Cookie。
遵循Cookie规范:原始 Netscape 规范、RFC 2109 和 RFC 2965。(很重要的区别)
2.System.Web.Cookie
表示 服务器端使用的Cookie ,属性没有System.Net.Cookie多
遵循Cookie规范:采用的Netscape cookie草案方案。
我们一般来理解他们的区别就是下面简单的一句:
System.Web命名空间下的是给服务器段用的,System.Net是给客户端程序用的。
实际上不止这点区别:
下面我们来对比这两个Cookie类的属性如下,这些属性都是Copy自MSDN中文版的说明文档:

System.Web.HttpCookie  类System.Net.Cookie 类
MSDN中对构造函数的描述:
已重载。 初始化 HttpCookie 类的新实例。
MSDN中对构造函数的描述:
已重载。 根据 Netscape 规范初始化 Cookie 类的新实例。通常,应用程序无需构造 Cookie 类,因为该类会基于通过 HTTP 响应接收的 Set-Cookie 标头自动创建。
 

Comment 

获取或设置服务器可添加到 Cookie 中的注释。

 

CommentUri 

获取或设置服务器可通过 Cookie 来提供的 URI 注释。

 

Discard 

获取或设置由服务器设置的丢弃标志。

Domain
获取或设置将此 Cookie 与其关联的域。

Domain 
获取或设置 Cookie 对其有效的 URI。

 

Expired 

获取或设置 Cookie 的当前状态。

Expires 
获取或设置此 Cookie 的过期日期和时间。

Expires 
获取或设置作为 DateTime 的 Cookie 过期日期和时间。

 

HttpOnly 
确定页脚本或其他活动内容是否可访问此 Cookie。

Name 
获取或设置 Cookie 的名称。

Name 
获取或设置 Cookie 的名称。

Path 
获取或设置要与当前 Cookie 一起传输的虚拟路径。

Path 
获取或设置此 Cookie 适用于的 URI。

 

Port 
获取或设置此 Cookie 适用于的 TCP 端口的列表。

Secure 
获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。

Secure 
获取或设置 Cookie 的安全级别。

 

TimeStamp 
获取此 Cookie 作为 DateTime 发出的时间。

Value 
获取或设置单个 Cookie 值。

Value 
获取或设置 Cookie 的 Value。

Values 
获取单个 Cookie 对象所包含的键值对的集合。

 
 

Version 
获取或设置此 Cookie 符合的 HTTP 状态维护版本。

参考:https://www.cnblogs.com/Frodo/archive/2008/04/26/1171955.html




C# .net中cookie值为中文时的乱码解决方法

一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取cookie的值会出现乱码 ...
  • u013010416
  • u013010416
  • 2014-01-04 10:47:26
  • 1979

C#网页cookie中文乱码问题解决方法

改成以下方式即可:写cookie: Response.Cookies["ID"].Value = HttpUtility.UrlEncode(TextBox1.Text); Response.Coo...
  • wf824284257
  • wf824284257
  • 2017-01-21 10:41:29
  • 382

asp.net中使用Cookie时用中文汉字引起的乱码

今晚我一网站程序突然停摆,报错误为某一转换语句:Convert.ToInt32(XXX,10);,此网站以前一直正常工作,经过跟踪检查,发现是变量为空 null,很奇怪的是,此变量是从Cookie内取...
  • belllab
  • belllab
  • 2007-04-06 12:15:00
  • 928

.Net MVC4.0(5) - Session&cookie

一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值: InProc State Server SQL Server “InProc”表示...
  • shuanger_
  • shuanger_
  • 2014-12-01 22:52:55
  • 624

ASP.NET 解决Cookie乱码

在Asp.net的HttpCookie中写入汉字,读取值为什么全是乱码?其实这是因为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来! 其实解决的方法很简单:只要在写入Cookie时,先...
  • dupeng0811
  • dupeng0811
  • 2010-11-01 17:30:00
  • 3099

mvc4 操作cookie

//test set cookie                     HttpCookie cookie = new HttpCookie("User");                 ...
  • sikaiyuan2008
  • sikaiyuan2008
  • 2014-07-18 15:32:19
  • 6487

关于存在cookie 里面出现乱码的问题

Cookie在保存中文的时候会出现中文乱码问题。在存的时候我们采用 $(".status").click(function () {                 $(this).sibling...
  • linshichen
  • linshichen
  • 2016-05-20 17:27:05
  • 585

URLEncode解决Cookie存取中文乱码

中文属于Unicode编码, 而英文属于Ascll编码, Cookie中又只能存储英文,要想向cookie中存取中文就要对中文进行编码 当向cookie中存储时,使用URLEncode类中的en...
  • Alexnul
  • Alexnul
  • 2016-09-19 17:31:53
  • 4443

asp.net Cookie值中文乱码问题解决方法

cookie里面不能写中文,是由于cookie先天的编码方式造成的,所以有必要存在一种中间的编码方式: URLEncode是最好的选择,感兴趣的你可千万不要错过了哈, 或许本文提供的知识点对你学习...
  • u011127019
  • u011127019
  • 2014-01-20 15:03:56
  • 731

解决utf-8编码页面cookie保存中文时乱码问题

cookie中保存中文的时候,在前台获取时经常回出现乱码问题,以.NET开发为例,在保存cookie的时候进行编码 Cookies[“cookiename”].Value = System.Web....
  • kissdeath
  • kissdeath
  • 2014-03-10 14:36:56
  • 7407
收藏助手
不良信息举报
您举报文章:关于c# .net 使用cookie存储和传输数据中出现乱码的一些问题总结
举报原因:
原因补充:

(最多只允许输入30个字)