今天工作上遇到一個問題,需要把一個對象集合List<Model>存入一個Cookie,按照原來都封裝方法存入都ok,但是到取值都時候中文會變成亂碼。 首先,我們可以確認Json和Cookie都有可能亂碼,我們可以在轉換Json和寫入寫出Cookie的時候都加入調試代碼,這樣可以看到轉換Json和Co ...
今天工作上遇到一個問題,需要把一個對象集合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 }
有什麼寫的不對的歡迎留言~~~~~~