ASP.NET 字符编码的那些事
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("<span>test</span> ")
<br />
2. <span>test</span>
<br />
3. @("<span>test</span>")
<br />
4. @HttpUtility.HtmlDecode("<span>test</span> ")
<br />
5. @HttpUtility.HtmlDecode("<span>test</span>")
<br />
6. @Html.Raw("<span>test</span> ")
<br />
7. @Html.Raw("<span>test</span>")
显示结果:
简单总结:
- 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
处理步骤:
- 从界面提交到应用服务器,不进行转码,值为:蟋蟀·博客园&URL 空格<>test。
- 从应用服务器提交到数据库,不进行转码,值为:蟋蟀·博客园&URL 空格<>test。
- 从数据库获取到应用服务器,不进行解码,值为:蟋蟀·博客园&URL 空格<>test。
- 从应用服务器展现到地址栏,进行转码(Uri.EscapeDataString),值为:蟋蟀·博客园%26URL%20空格<>test。
- 从浏览器响应到应用服务器,不进行解码,值为:蟋蟀·博客园&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>
ASP.NET 字符编码的那些事的更多相关文章
- 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...
- (转载)字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
- 关于Unicode,字符集,字符编码,每个程序员都应该知道的事
关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...
- 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...
- 关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASCII码说起 说到字符编码,不得不说ASCII ...
- Python:字符编码详解
相关文章 Python中文编码问题:为何在控制台下输出中文会乱码及其原理 1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Informati ...
- Python 字符编码 zz
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...
- Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- 【转】Python字符编码详解
转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American S ...
随机推荐
- VMware Workstation 12序列号
VMware Workstation 12序列号:5A02H-AU243-TZJ49-GTC7K-3C61N 就好像之前微软,让大家用盗版一样,这样可以更快的拥有市场占有率.事实上,输入key即可永久 ...
- (转)Eclipse和MyEclipse安装和使用git(egit)图解笔记
Eclipse.MyEclipse使用git插件(egit)图解 (转)原文来自:http://www.xuebuyuan.com/446322.html 在开发Java.JavaEE等相关程序时,我 ...
- php获取网卡MAC地址源码
<?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = ...
- 简单的jquery选项卡效果
html部分 <ul class="tab"> <li>最新</li> <li class="cur">热门&l ...
- Django数据导入
从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1.7, Django 1. ...
- angularJs 指令的理解
指令: 可以把指令理解成为特定的DOM 上运行的函数,指令扩展了这个元素的功能: 例如:ng-click--在DOM元素上绑定了一个click事件的监听,并在监听到事件时运行angular表达式 自定 ...
- 广州PostgreSQL用户会技术交流会小记 2015-9-19
广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...
- HDFS DataNode 设计实现解析
前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切 ...
- 使用EF取数据库返回的数据
目录 一.取oracle自定义函数返回的自定义类型. 一.取oracle自定义函数返回的自定义类型. 1.首先创建一个函数返回自定义类型集合 --1.建立自定义类型 CREATE OR REPLACE ...
- SEO:让搜索引擎对你的网站更有亲和力(译)
人可以通过查看网站信息了解网站的内容,但是搜索引擎只对标签感兴趣,对内容的识别能力是很低的,如何让蜘蛛通过标签认识你的文章内容呢~ 原文网址:http://schema.org/docs/gs.htm ...