对HtmlEncode的增强——HtmlEntitiesEncode
工作中我们常常需要加壳(escape)后传输或保存HTML文本,UI层使用时再进行脱壳(unescape)。
很庆幸.net为我们提供了非常好用的HttpUtility类,加壳时可采用HtmlEncode方法,脱壳时采用HtmlDecode。
但实际使用这两个方法时,即可知道HtmlDecode很好很实用;HtmlEncode却显得先天不足,仅能转换很少的一些html标记(如:<),
中文、全角符号或大量的特殊字符根本没有进行转换。因此在传输或保存入库时总会遇到这样那样的问题。
解决这一问题的方法其实很简单,每一个可敲出的字符总是对应了一个Unicode编码,而编码又对应了一个32位的整形数字,
那么使用 &#{数字}; 的形式就可以转换文本,即HtmlEntities。
[关于HtmlEntities可查看:http://www.cnblogs.com/templates/waxdoll/htmlentities.htm]
转换的函数:
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 }
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)
测试代码:
1 protected void Button3_Click(object sender, EventArgs e)
2 {
3 // 常规HtmlEncode编码
4 string strHtmlEncode = HttpUtility.HtmlEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
5
6 // 增强的HtmlEntities编码
7 string strHtmlEntitiesEncode = HtmlEntitiesEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
8
9 string strHtmlDecode1 = HttpUtility.HtmlDecode(strHtmlEncode);
10
11 string strHtmlDecode2 = HttpUtility.HtmlDecode(strHtmlEntitiesEncode);
12 }
2 {
3 // 常规HtmlEncode编码
4 string strHtmlEncode = HttpUtility.HtmlEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
5
6 // 增强的HtmlEntities编码
7 string strHtmlEntitiesEncode = HtmlEntitiesEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
8
9 string strHtmlDecode1 = HttpUtility.HtmlDecode(strHtmlEncode);
10
11 string strHtmlDecode2 = HttpUtility.HtmlDecode(strHtmlEntitiesEncode);
12 }
运行时监视截图:
可以很清楚的看到增强的HtmlEncode方法较完美地转换了中文或一些特殊字符,而且HtmlDecode的结果都是一样的。