工作中我们常常需要加壳(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 }
|