【IT168技术文档】
工作中我们常常需要加壳(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 }
运行时监视截图: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 }
可以很清楚的看到增强的HtmlEncode方法较完美地转换了中文或一些特殊字符,而且HtmlDecode的结果都是一样的。