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

一、目的:中文属于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




阅读更多

没有更多推荐了,返回首页