ASP.NET 字符编码的那些事

简介:

171235127605554.jpg

ASP.NET 中的字符编码问题,一般会有两个场景:

  • HTML 编码:一般是动态显示 HTML 字符或标签,写法是:HttpUtility.HtmlDecode(htmlString) 或 Html.Raw(htmlString) 等。
  • URL 编码:一般是作为 URL 的一部分,写法是:HttpUtility.UrlDecode(urlString) 或 Uri.EscapeDataString(urlString) 等,具体的流程就是上面的图,因为涉及到 URL 及请求处理,所以对于一些特殊字符的处理,要格外小心。

HTML 编码

在 ASP.NET 中,这也是我们使用最多的一种,流程很简单,把 HTML 标签内容存储到数据库,然后再获取出来展示,在存储数据库之前,一般会进行 HTML 编码,因为 MVC 在展示的时候,会对字符型的 HTML 做保护处理,所以要对 HTML 编码后的字符,再进行转码。

MVC 展示字符一般会有两个场景:

  • 显示 HTML 字符(比如 < > 等特殊字符)。
  • 显示 HTML 标签(把字符作为 HTML 标签显示)。

我们来看一个代码示例:

1. @HttpUtility.HtmlEncode("&lt;span&gt;test&lt;/span&gt; ")
<br />
2. &lt;span&gt;test&lt;/span&gt; 
<br />
3. @("<span>test</span>")
<br />
4. @HttpUtility.HtmlDecode("&lt;span&gt;test&lt;/span&gt; ")
<br />
5. @HttpUtility.HtmlDecode("<span>test</span>")
<br />
6. @Html.Raw("&lt;span&gt;test&lt;/span&gt; ")
<br />
7. @Html.Raw("<span>test</span>")

显示结果:

171523121049657.png

简单总结:

  • HttpUtility.HtmlDecode 和 Html.Raw 作用并不相同。
  • HttpUtility.HtmlDecode 仅仅是对编码后的 HTML 进行转码,效果和第三点一样。
  • Html.Raw 是对原字符进行直接输出,是什么就是什么。
  • HttpUtility.HtmlDecode 一般会用在显示 HTML 字符。
  • Html.Raw 一般会用在显示 HTML 标签。

URL 编码

关于 URL 编码,说简单也简单,说复杂也很头疼,简单列举下几种常用方式:

  • HttpUtility.UrlEncode:最常用的一种,一般是对参数进行编码,但对于一些特殊字符不适用,而且 URL 显示不友好。
  • Uri.EscapeDataString相关博文,处理一些特殊字符(+),需要在 web.config 中配置 allowDoubleEscaping 为 true。

在最上面图中,一共有五步流程,但都是问号,下面我用一个示例,来说明这五步具体该如何操作,示例 URL:

http://www.cnblogs.com/xishuai/tag/蟋蟀·博客园&URL 空格<>test

处理步骤:

  1. 从界面提交到应用服务器,不进行转码,值为:蟋蟀·博客园&URL 空格<>test。
  2. 从应用服务器提交到数据库,不进行转码,值为:蟋蟀·博客园&URL 空格<>test。
  3. 从数据库获取到应用服务器,不进行解码,值为:蟋蟀·博客园&URL 空格<>test。
  4. 从应用服务器展现到地址栏,进行转码(Uri.EscapeDataString),值为:蟋蟀·博客园%26URL%20空格<>test。
  5. 从浏览器响应到应用服务器,不进行解码,值为:蟋蟀·博客园&URL 空格<>test。

在上面第4、5步的时候,URL 会变为:

http://www.cnblogs.com/xishuai/tag/%E8%9F%8B%E8%9F%80%C2%B7%E5%8D%9A%E5%AE%A2%E5%9B%AD%26URL%20%E7%A9%BA%E6%A0%BC%3C%3Etest

这个不需要你进行任何操作,从浏览器到服务器、从服务器到浏览器,这个过程中,URL 会进行自动转码和解码,比如你在 Action 中获取 Tag 值,并不需要使用 HttpUtility.UrlDecode 解码操作。

不过,针对一些特殊的字符,因为第5步是请求操作,IIS 会对请求进行一些检测,web.config 还需要进行下面配置:

<system.web>
    <compilation targetFramework="4.5" />
    <httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="" /><!--添加的配置-->
</system.web>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <security>
        <requestFiltering allowDoubleEscaping="true"/><!--添加的配置-->
    </security>
</system.webServer>

总的来说,URL 特殊字符编码问题,只使用 Uri.EscapeDataString,然后 web.config 进行如上配置就可以了。

///2015-6-2更新:

如果 URL 包含“.”参数,如:www.cnblogs.com/xishuai/tag/....../,则会出现“404”错误(IIS 截获了,没有到应用程序),但并非是 HTTP 状态码,解决方式:

<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" /><!--添加的配置-->
</system.web>

相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
114 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
113 0
|
9月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
144 0
|
9月前
|
开发框架 缓存 JSON
ASP.NET Core MVC 从入门到精通之Filter
ASP.NET Core MVC 从入门到精通之Filter
120 0
|
9月前
|
开发框架 前端开发 .NET
ASP.NET Core MVC 从入门到精通之自动映射(二)
ASP.NET Core MVC 从入门到精通之自动映射(二)
60 0
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
8月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(完:内附源码)
经过一段时间的准备,【ASP.NET Core MVC开发实战之商城系统】已经完成,目前代码已开发完成,先将全部内容整理分享,如有不足之处,还请指正。
107 0