Web編碼與交換資訊
在ASP.NET Web和瀏覽器之間編碼並交換資訊。To encode to exchange between browser and ASP.NET web.使用 .NetFramework (C#) 之 System.Uri.EscapeDataString() 與 JavaScript 之 encodeURIComponent() 函式。REC3986規格。
原理
因為 .NetFramework(C#)之System.Uri.EscapeDataString 與 Browser(JavaScript)之window.decodeURIComponent 的編碼解碼規格皆是『RFC 3986』所以可以互通,實作上也支援UTF8中文字元的編解碼。
範例
// cshtml 後端編碼並存入cookie
var info = new { foo='什麼都可以什麼都不奇怪。', bar=12345.6789 };
string json = Newtonsoft.Json.JsonConvert.SerializeObject(info, Newtonsoft.Json.Formatting.None);
string encoded = System.Uri.EscapeDataString(json); //『RFC 3986』編碼
var infoCookie = new HttpCookie("cookiename", encoded);
infoCookie.HttpOnly = false; // 非HttpOnly才能在Browser端取得值。
infoCookie.Expires = DateTime.Now.AddSeconds(29);
Response.Cookies.Add(infoCookie);
// html.js 前端取cookie並解碼
const encoded = $.cookie("cookiename")
$.removeCookie("info"); // 取值後馬上清除。
const json = window.decodeURIComponent(encoded); // 『RFC 3986』解碼
const info = JSON.parse(json);
範例二
info => json => rfc3986 => base64 => encrypt (plus)
@{
// cshtml 後端編碼並存入交換區
string encoded = Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
Uri.EscapeDataString(
JsonConvert.SerializeObject(info))));
}
<script>
window['EXCHANGE_ID'] = '@encoded';
</script>
// html.js 前端取交換資料並解開
const info = JSON.parse(
window.decodeURIComponent(
window.atob(window['EXCHANGE_ID'])));
window['EXCHANGE_ID'] = undefined; // 取值後馬上清除。
utf8_to_b64
傳統上有 atob() 與 btoa() 函式可以 ASCII 與 Base64轉換,若是UTF8字元,則需再加工編碼如下:
function utf8_to_b64( str ) {
return window.btoa(unescape(encodeURIComponent( str )));
}
function b64_to_utf8( str ) {
return decodeURIComponent(escape(window.atob( str )));
}
// Usage:
utf8_to_b64('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
b64_to_utf8('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
Last updated