為了適應某種特殊需要,字符需要根據規則進行轉碼,便於傳輸、展現以及其他操作等。
看看下面的轉碼,就知道他的用處了。
1、字符串轉碼
根據原編碼格式與目標編碼格式,完成轉換。不過可能出現亂碼哦。上一章已經介紹過了。
代碼:
/// <summary> /// 字符串編碼轉換 /// </summary> /// <param name="srcEncoding">原編碼</param> /// <param name="dstEncoding">目標編碼</param> /// <param name="srcBytes">原字符串</param> /// <returns>字符串</returns> public static string TransferEncoding(Encoding srcEncoding, Encoding dstEncoding, string srcStr) { byte[] srcBytes = srcEncoding.GetBytes(srcStr); byte[] bytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes); return dstEncoding.GetString(bytes); }
測試用例:
input = "歡迎來到轉碼世界!"; result = Transfer.TransferEncoding(Encoding.Default, Encoding.UTF8, input);//歡迎來到轉碼世 界! Console.WriteLine("TransferEncoding 結果:{0}",result); result = Transfer.TransferEncoding(Encoding.UTF8,Encoding.Default,result); Console.WriteLine("TransferEncoding 反轉碼結果:{0}", result);//歡迎來到轉碼世界 !
2、Html轉碼
要點:將字符 < 和 > 在嵌入到文本塊中時被編碼為 < 和 >
如果在 HTTP 流中傳遞空白和標點之類的字符,則它們在接收端可能會被錯誤地解釋。 HTML 編碼將 HTML 中不允許使用的字符轉換為等效字符實體;HTML 解碼會反轉此編碼過程。 例如,為進行 HTTP 傳 輸,字符 < 和 > 在嵌入到文本塊中時被編碼為 < 和 >。要編碼或解碼 Web 應 用程序之外的值,請使用 WebUtility 類。
轉碼:
/// <summary> /// html轉碼 /// </summary> /// <param name="html"></param> /// <returns></returns> public static string HtmlEncode(string html) { return HttpUtility.HtmlEncode(html);//System.Net.WebUtility.HtmlEncode(html); }
解碼:
/// <summary> /// html解碼 /// </summary> /// <param name="html"></param> /// <returns></returns> public static string HtmlDecode(string html) { return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html); }
測試用例:
//HtmlEncode測試 result = string.Empty; input = "<head>you & me</head>"; result = Transfer.HtmlEncode(input); //結果: <head>you & me</head> Console.WriteLine("Html Encode: {0}", result); result = Transfer.HtmlDecode(result);//結果: <head>you & me</head> Console.WriteLine("Html Decode: {0}",result);
3、Url編碼
要點:對URL的特殊字符進行轉義,使其合法。
可用於對整個 URL(包括查詢字符串值)進行編碼的方法。如果在 HTTP 流中傳遞空白和標點之類的 字符,則它們在接收端可能會被錯誤地解釋。 URL 編碼將 URL 中不允許使用的字符轉換為等效字符實 體;URL 解碼會反轉此編碼過程。 例如,當嵌入到要在 URL 中傳輸的文本塊中時,字符 < 和 > 分別被編碼為 %3c 和 %3e。
默認情況下 HttpUtility.UrlEncode 方法使用 UTF-8 編碼。 因此,使用 UrlEncode 方法提供結果 相同使用 UrlEncode 方法並指定 UTF8 作為第二個參數。 UrlEncode 是一種簡便方式,用於在運行時 從 ASP.NET 應用程序訪問 UrlEncode 方法。 在內部,UrlEncode 使用 UrlEncode 方法輸入字符串。 要編碼或解碼 Web 應用程序之外的值,請使用 WebUtility 類。
HttpUtility的命名空間:System.Web
Url轉碼
/// <summary> /// Url轉碼 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string UrlEncode(string url) { return HttpUtility.UrlEncode(url); }
Url解碼
/// <summary> /// Url解碼 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string UrlDecode(string url) { return HttpUtility.UrlDecode(url); }
測試用例:
//UrlEncode測試 input = "http://www.baidu.com?username=<find>&content=ab c"; result = Transfer.UrlEncode(input);//結果:http%3a%2f% 2fwww.baidu.com%3fusername%3d%3cfind%3e%26content%3dab+c Console.WriteLine("Url Encode: {0}",result); result = Transfer.UrlDecode(result);//結果:http://www.baidu.com? username=<find>&content=ab c Console.WriteLine("Url Decode: {0}", result);
4、Base64
Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。
要點:采用64個基本的ASCII碼字符對數據進行重新編碼,用於加密和傳輸。
編碼規則
Base64編碼的思想是是采用64個基本的ASCII碼字符對數據進行重新編碼。它將需要編碼的數據拆分 成字節數組。以3個字節為一組。按順序排列24 位數據,再把這24位數據分成4組,即每組6位。再在每 組的的最高位前補兩個0湊足一個字節。這樣就把一個3字節為一組的數據重新編碼成了4個字節。當所要 編碼的數據的字節數不是3的整倍數,也就是說在分組時最後一組不夠3個字節。這時在最後一組填充1到 2個0字節。並在最後編碼完成後在結尾添加1到2個 “=”。
例:將對ABC進行BASE64編碼:
1、首先取ABC對應的ASCII碼值。A(65)B(66)C(67); 2、再取二進制值A (01000001)B(01000010)C(01000011); 3、然後把這三個字節的二進制碼接起來( 010000010100001001000011); 4、 再以6位為單位分成4個數據塊,並在最高位填充兩個 0後形成4個字節的編碼後的值,(00010000)(00010100)(00001001)(00000011),其中藍色部分 為真實數據; 5、再把這四個字節數據轉化成10進制數得(16)(20)(9)(3); 6、最後根據BASE64給出的64個基本字符表,查出對應的ASCII碼字符(Q)(U)(J)(D ),這裡的值實際就是數據在字符表中的索引。
BASE64字符表:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
應用:
1、Base64編碼可用於在HTTP環境下傳遞較長的標識信息
2、Base64 也會經常用作一個簡單的“加密”來保護某些數據,比如URL,而真正的加密 通常都比較繁瑣。
代碼實現
Base64轉碼
/// <summary> /// Base64轉碼 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string ToBase64(string input) { byte[] bytes = Encoding.UTF8.GetBytes(input); return Convert.ToBase64String(bytes); }
Base64解碼:
/// <summary> /// Base64字符串解碼 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string FromBase64(string input) { byte[] bytes = Convert.FromBase64String(input); return Convert.ToBase64String(bytes); }
測試用例:
//Base64轉碼測試 input = "Coming from the new world!"; result = Transfer.ToBase64 (input); //結果:Q29taW5nIGZyb20gdGhlIG5ldyB3b3JsZCE= Console.WriteLine("ToBase64 : {0}",result); result = Transfer.FromBase64(result); //結果:Coming from the new world! Console.WriteLine("FromBase64 : {0}", result);
5、BitConverter
將基礎數據類型與字節數組相互轉換。 BitConverter 類以一系列字節的形式有助於操控基本窗體中 的值類型。 一個字節定義為一個 8 位無符號整數。 如下表所示,BitConverter 類包括用靜態方法將 每個基元類型轉換成字節數組和將字節數組轉換成其基元類型。
在這裡我們以最基本的字符串類型為例說明。
byte轉為String
/// <summary> /// 字節數組轉為字符串 /// 將指定的字節數組的每個元素的數值轉換為它的等效十六進制字符串表示形式。 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string BitToString(byte[] bytes) { if (bytes == null) { return null; } //將指定的字節數組的每個元素的數值轉換為它的等效十六進制字符串表示形式。 return BitConverter.ToString(bytes); }
十六進制string轉byte
/// <summary> /// 將十六進制字符串轉為字節數組 /// </summary> /// <param name="bitStr"></param> /// <returns></returns> public static byte[] FromBitString(string bitStr) { if (bitStr == null) { return null; } string[] sInput = bitStr.Split("-".ToCharArray()); byte[] data = new byte[sInput.Length]; for (int i = 0; i < sInput.Length; i++) { data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber); } return data; }
測試用例:
//bit轉碼 input = "Coming from the new world!"; result = Transfer.BitToString(Encoding.UTF8.GetBytes(input)); //結果: 43-6F-6D-69-6E-67-20-66-72-6F-6D-20-74-68-65-20-6E-65-77-20-77-6F-72-6C-64-21 Console.WriteLine("BitToString : {0}", result); result = Encoding.UTF8.GetString(Transfer.FromBitString(result)); //結果:Coming from the new world! Console.WriteLine("FromBitString : {0}", result);
運行截圖:
查看本欄目