工作中我們常常需要加殼(escape)後傳輸或儲存HTML文本,UI層使用時再進行脫殼(unescape)。
很慶幸.net為我們提供了非常好用的HttpUtility類,加殼時可采用HtmlEncode方法,脫殼時采用HtmlDecode。
但實際使用這兩個方法時,即可知道HtmlDecode很好很實用;HtmlEncode卻顯得先天不足,僅能轉換很少的一些html标記(如:<),
中文、全角符号或大量的特殊字元根本沒有進行轉換。是以在傳輸或儲存入庫時總會遇到這樣那樣的問題。
解決這一問題的方法其實很簡單,每一個可敲出的字元總是對應了一個Unicode編碼,而編碼又對應了一個32位的整形數字,
那麼使用 {數字}; 的形式就可以轉換文本,即HtmlEntities。
轉換的函數:
1
/**//// <summary>
2
/// HTMLEntitiesEncode(HTMLEntities編碼)
3
/// </summary>
4
/// <param name="text">需要轉換的html文本</param>
5
/// <returns>HTMLEntities編碼後的文本</returns>
6
public static string HtmlEntitiesEncode(string text)
7
{
8
// 擷取文本字元數組
9
char[] chars = HttpUtility.HtmlEncode(text).ToCharArray();
10
11
// 初始化輸出結果
12
StringBuilder result = new StringBuilder(text.Length + (int)(text.Length * 0.1));
13
14
foreach (char c in chars)
15
16
// 将指定的 Unicode 字元的值轉換為等效的 32 位有符号整數
17
int value = Convert.ToInt32(c);
18
19
// 内碼為127以下的字元為标準ASCII編碼,不需要轉換,否則做 {數字}; 方式轉換
20
if (value > 127)
21
22
result.AppendFormat("{0};", value);
23
}
24
else
25
26
result.Append(c);
27
28
}
29
30
return result.ToString();
31
}
(使用時記得引入 using System.Text)
測試代碼:
protected void Button3_Click(object sender, EventArgs e)
// 正常HtmlEncode編碼
string strHtmlEncode = HttpUtility.HtmlEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
// 增強的HtmlEntities編碼
string strHtmlEntitiesEncode = HtmlEntitiesEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
string strHtmlDecode1 = HttpUtility.HtmlDecode(strHtmlEncode);
string strHtmlDecode2 = HttpUtility.HtmlDecode(strHtmlEntitiesEncode);
運作時監視截圖:
可以很清楚的看到增強的HtmlEncode方法較完美地轉換了中文或一些特殊字元,而且HtmlDecode的結果都是一樣的。