zoukankan      html  css  js  c++  java
  • 编码与解码

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

    结果

  • 相关阅读:
    JeePlus:代码生成器
    JeePlus:API工具
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5221749.html
Copyright © 2011-2022 走看看