记录一次关于Cookie、Json中文乱码的解决方法
今天工作上遇到一个问题,需要把一个对象集合List<Model>存入一个Cookie,按照原来都封装方法存入都ok,但是到取值都时候中文会变成乱码。
首先,我们可以确认Json和Cookie都有可能乱码,我们可以在转换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 }
有什么写的不对的欢迎留言~~~~~~