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 }

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

  • 相关阅读:
    [大数据相关] Hive中的全排序:order by,sort by, distribute by
    [mysql] Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
    【hadoop环境问题】namenode无法启动问题解决
    【java】Java.math.BigDecimal.subtract()方法实例
    利用 force index优化sql语句性能
    navicat连接远程数据库报错'client does not support authentication protocol requested by server consider ...'解决方案
    spark SQL学习(数据源之parquet)
    spark SQL学习(load和save操作)
    spark学习(RDD案例实战)
    spark学习12(Wordcount程序之spark-shell)
  • 原文地址:https://www.cnblogs.com/zousc/p/11091035.html
Copyright © 2011-2022 走看看