在web开发中,经常遇到编码与解码的问题,有的用于Hmtl的编码与解码,有的用于url的编码与解码。咋ibutong的场景下,一些符号不能直接使用,这个时候就需要对其进行编码与解码的操作了。
HTML编码与解码
Html是一种标记语言,其中<>符号有着特殊的意义,当我们想在页面上展示包含这些符号的时候,就会造成浏览器错误的处理。
例如,一些有关于开发的网站,希望在页面上展示标签的内容,如:<h1>2016年,某年某月</h1>,但,html中,标记<h1>表示1号标题,就会在页面中使用1号标题,造成不是我们想要的展示结果。HtmlEncode方法用于对文本中的<,>进行编码,以避免与html中的标记冲突,导致文本内容被浏览器解释为网页标记。
解码的过程比较简单,一般是由浏览器来完成,浏览器会分析编码后的文本,然后进行html的解码,以正确的显示网页的内容。当然,如果需要,也可以通过HtmlDecode方法对编码后的html进行解码。
protected void Page_Load(object sender, EventArgs e) { string html = "<h1>面朝大海,春暖花开</h1>"; string htmlEncode = Server.HtmlEncode(html); Response.Write(htmlEncode); }
输出
f12查看,生成的html
URL编码与解码
在开发工作中,经常遇到url中有汉字的情况,但url又与html不同,它不是标记语言,但需注意的是,在url中只应该出现ASCII字符。对于url中出现的ASCII之外的字符,必需对其进行转换了,URL编码的目的就是对其进行有效的格式转换,转换为ASCII编码。UrlEncode方法用来对Url字符串进行编码,以避免url中的信息被错误的解读。
UrlEncode首先使用呼应中过的编码对内容进行编码,编码后的字节数组再看成是ASCII字符,其中A~Z,a~z,0-9,-,_,.,!,*,\,(,)被认为是安全的字符,不需要特特殊编码。其他字符要经过字符编码,空格编码为+,剩下的被编码为%引导的十六进制表示方法。
protected void Page_Load(object sender, EventArgs e) { string url = "http://hello world.com/test.aspx?name=张三"; Response.Write(Server.UrlEncode(url)); }
输出
与html的解码类似,url的解码一般是由web服务器完成的,并不需要人为参与,特殊情况下,可以通过UrlDecode方法对url进行解码。
URL Path编码与解码
UrlPathEncode仅仅编码Url的path部分。
它首先使用UTF8编码对字符串进行转换,将转换后的结果看成ASCII串,然后,将其中的空格替换为%20.
仍以http://hello world.com/test.aspx?name=张三 这个url为例,通过UrlPathEncode进行编码的结果为
http://hello%20world.com/test.aspx?name=张三
通过对比,你会发现UrlPathEncode与UrlEncode的不同。对于参数部分并没有起作用,而且空格被编码为%20,而不是+。
常用场景,通过http下载文件的时候,有的网站页面上显示的中文文件名是正常的,但是下载到本地文件名就是乱码,这就是又与没有正确编码造成的,可以通过将文件名通过UrlPathEncode编码后输出,避免乱码的问题。
protected void Page_Load(object sender, EventArgs e) { string fileName = "本质论.txt"; string filePath = Server.MapPath("~/" + fileName); //以字符流的形式下载文件 FileStream fs = new FileStream(filePath, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); }
如图所示
使用UrlPathEncode编码后,输出的实际名称为:%e6%9c%ac%e8%b4%a8%e8%ae%ba.txt,但,经过浏览器的分析后,就可以还原为原来的名称了。
UrlToken编码与解码
UrlTokenDecode用于在url中以字符串的形式传递一个字节数组的时候使用,它通过将字节数组转换为一个base64的方式来完成,UrlTokenDecode用于对编码之后的串进行解码。
一个例子,我们在一个页面,初始化一个字节数组,并通过UrlTokenDecode编码,通过Url的方式传递给另一个页面,在另一个页面进行解码。
namespace HttpRequestDemo { public partial class UrlTokenEncode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string name = "wolfy"; byte[] buffer = Encoding.UTF8.GetBytes(name); Response.Redirect("/UrlTokenDecode.aspx?name=" + HttpServerUtility.UrlTokenEncode(buffer)); } } }
解码
namespace HttpRequestDemo { public partial class UrlTokenDecode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string name = Request.QueryString["name"]; Response.Write(Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(name))); } } }
结果