记录一次关于Cookie、Json中文乱码的解决方法

今天工作上遇到一个问题,需要把一个对象集合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 }

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

 

posted @ 2019-06-26 17:06  贰拾~  阅读(917)  评论(0编辑  收藏  举报