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

    结果

  • 相关阅读:
    Java学习-068-多线程01:继承 Thread 类
    Linux-026-Centos Nginx 配置 pid 文件路径解决 service nginx status 提示:Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
    Linux-025-Centos Nginx 代理配置:同一端口代理不同服务
    Linux-024-Centos Nginx 代理配置:不同端口代理不同服务
    Linux-023-Centos Nginx Lua 脚本三种基本引用方式示例
    Linux-022-Centos Nginx 配置环境变量,常规命令
    Linux-021-Centos Nginx 配置服务管理,并设置开机启动
    Linux-020-Centos Shell 安装 Nginx 1.18.0
    Linux-019-Centos Shell 安装 Nginx 后启动时提示找不到Lua模块的libluajit-5.1.so.2文件,具体提示信息:./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
    PySe-021-requests 使用 proxies 参数实现通过代理访问目标地址
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5221749.html
Copyright © 2011-2022 走看看