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

3

4

5

6

7


8

9

10

11

12

13

14

15


16

17

18

19

20

21


22

23

24

25


26

27

28

29

30

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

4

5

6

7

8

9

10

11

12

运行时监视截图:
可以很清楚的看到增强的HtmlEncode方法较完美地转换了中文或一些特殊字符,而且HtmlDecode的结果都是一样的。