zoukankan      html  css  js  c++  java
  • 记录一次关于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 }

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

  • 相关阅读:
    奇虎360安全牛人全球挑战赛无线部…
    C经典之14-双向链表存储1-10---ShinePans
    linux杂谈(十五):ftp的企业应用级的配置(二)
    Cocos2d-x 3.0心得(01)-图片载入与混合模式
    Windows装10gRAC须要注意的几个要点(怎样解决PRKH-1010和PRKR-1062的错误)
    query多选下拉框插件 jquery-multiselect(改动)
    SICP 习题 (1.42)解题总结
    电话号码 【trie树】
    hdu 3854 Glorious Array(线段树or树状数组)
    【转载】CGLib动态代理原理及实现
  • 原文地址:https://www.cnblogs.com/zousc/p/11091035.html
Copyright © 2011-2022 走看看