System.Web.dll中,System.Web.HttpUtility.HtmlEncode(string s)方法的原理是这样的:
首先判断传入的字符串是否为null,如果是,则返回null
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
然后,尝试在传入的字符串中查找需要进行HTML字符转换的字符(即<,>,&,"),如果找不到,则不做任何处理返回
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
其中IndexOfHtmlEncodingChars是一个unsafe关键字声明的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
该方法使用指针来对字符串进行查找(<,>,&,"),如果存在则返回index,否则返回-1.
然后将<替换为<,>替换为>,&替换为&,"替换为"
也就是说:如果字符串被执行了HtmlEncode之后,如果确实有字符被执行了替换。则一定会含有“&”字符,这就能理解为什么System.Web.HttpUtility.HtmlDecode为什么以“&”作为特征字符来判断字符串是否有字符需要被还原。