今天工作上遇到一个问题,需要把一个对象集合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 }
有什么写的不对的欢迎留言~~~~~~
黄山市民网:https://www.huangshanshimin.com/