编码与解码

在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)));
        }
    }
}

结果

原文地址:https://www.cnblogs.com/wolf-sun/p/5221749.html