对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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
foreach (char c in chars)
15
{
16
// 将指定的 Unicode 字符的值转换为等效的 32 位有符号整数
17
int value = Convert.ToInt32(c);
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
// 内码为127以下的字符为标准ASCII编码,不需要转换,否则做 &#{数字}; 方式转换
20
if (value > 127)
21
{
22
result.AppendFormat("&#{0};", value);
23
}
24
else
25
{
26
result.Append(c);
27
}
28
}
29![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
return result.ToString();
31
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
(使用时记得引入 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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
// 增强的HtmlEntities编码
7
string strHtmlEntitiesEncode = HtmlEntitiesEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
string strHtmlDecode1 = HttpUtility.HtmlDecode(strHtmlEncode);
10![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
string strHtmlDecode2 = HttpUtility.HtmlDecode(strHtmlEntitiesEncode);
12
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
运行时监视截图:
可以很清楚的看到增强的HtmlEncode方法较完美地转换了中文或一些特殊字符,而且HtmlDecode的结果都是一样的。