今天工作上遇到一个问题,需要把一个对象集合list<model>存入一个cookie,按照原来都封装方法存入都ok,但是到取值都时候中文会变成乱码。

首先,我们可以确认jsoncookie都有可能乱码,我们可以在转换json和写入写出cookie的时候都加入调试代码,这样可以看到转换json和cookie的值。

先解决json转换问题,乱码的原因无非在于编码问题(一般都是吧)所以在转换json格式的时候呢我们需要对字符进行编码

encoding encode = system.text.encoding.getencoding("unicode");

json编码后中文就可以正常显示了~

 

cookie都名称或子cookie的名称或子cookie的名称不能为中文,否则无法获得cookie,所以就不能使用中文,这算是个解决都办法吧,但是如果需要使用的数据中有中文呢,那就只能进行编码了,如下:

cookie的时候进行编码:

cookie.value = httputility.urlencode("name");

 

cookie时候,进行解码:

cookievalue = httputility.urldecode(cookie.value);

 

 

最后,编码和解码要保持一致:

system.web.httputility.urldecode

system.web.httputility.urlencode
system.web.httpcontext.current.server.urldecode

system.web.httpcontext.current.server.urlencode

 

 

解决方法:

1.先把集合转成json字符串(我使用下面转换json方法的时候没有乱码):

string json = tojson(list<model>);

 

2.接下来我们把转换好的json字符串写入cookie:

writecookie1("cook", json);

 

这样就写入成功了!!!

 

3.接下来就可以通过以下代码取出数据:

string jsonstr =getcookie("cook");//获取json

 

4.获取实体集合

list<model> list=toobject<list<model>>(jsonstr);//json转换成实体集合

 

以下是 存取cookie、转换json都方法:

 

 1  
 2 
 3 /// <summary>
 4 
 5 /// 写cookie值,包括中文编码
 6 
 7 /// </summary>
 8 
 9 /// <param name="strname">名称</param>
10 
11 /// <param name="strvalue">值</param>
12 
13 public static void writecookie(string strname, string strvalue)
14 
15 {
16 
17 httpcookie cookie = httpcontext.current.request.cookies[strname];
18 
19 if (cookie == null)
20 
21 {
22 
23 cookie = new httpcookie(strname);
24 
25 }
26 
27 cookie.value = httputility.urlencode(strvalue, encoding.getencoding("utf-8"));
28 
29 httpcontext.current.response.appendcookie(cookie);
30 
31 }
32 
33 /// <summary>
34 
35 /// 读cookie值,包括中文编码
36 
37 /// </summary>
38 
39 /// <param name="strname">名称</param>
40 
41 /// <returns>cookie值</returns>
42 
43 public static string getcookie(string strname)
44 
45 {
46 
47 if (httpcontext.current.request.cookies != null && httpcontext.current.request.cookies[strname] != null)
48 
49 {
50 
51 return httputility.urldecode(httpcontext.current.request.cookies[strname].value.tostring(), encoding.getencoding("utf-8"));
52 
53 }
54 
55 return "";
56 
57 }
58 
59 
60 #region json序列化
61 
62 /// <summary>json序列化</summary>
63 
64 /// <param name="obj">object </param>
65 
66 /// <returns></returns>
67 
68 public static string tojson(object obj) {
69 
70 var idtc = new newtonsoft.json.converters.isodatetimeconverter { datetimeformat = "yyyy-mm-dd hh:mm:ss" };
71 
72  
73 
74 return jsonconvert.serializeobject(obj, idtc);
75 
76 }
77 
78 #endregion
79 
80  
81 
82 #region json反序列化
83 
84 /// <summary>反序列化</summary>
85 
86 /// <typeparam name="t">类型</typeparam>
87 
88 /// <param name="text">json字符串</param>
89 
90 /// <returns>类型数据</returns>
91 
92 public static t toobject<t>(string text) {
93 
94 return (t)jsonconvert.deserializeobject(text, typeof(t));
95 
96 }

有什么写的不对的欢迎留言~~~~~~