zoukankan      html  css  js  c++  java
  • Chapter 21_5.1 URL编码

      URL编码是http所使用的一种编码方式,用于在一个URL中传送各种参数。该编码方式会将特殊字符("=","&","+")编码为"%<xx>"形式。

    <xx>是字符的十六进制表示。此外,它还会将空格转换为"+",例如,它会将字符串"a+b = c" 编码为:"a%2Bb+%3D+c"

    最后,它会将每对参数名及其值用"="连接起来,并将每对结果name = value用"&"连接起来,例如,对于值:

    name="al" ; quary = "a+b = c"; q="yes or no"

    会被编码为:

    "name=al&query=a%2Bb+%3D+c&q=yes+or+no"   -- "+" 在这里是空格

    现在,要对这个URL进行解码。要求对编码中的每个值,以其名称作为key,保存到一个table内:

    function unescape(s)
        s = string.gsub(s,"+"," ")  --将+转换为空格
        s = string.gsub(s,"%%(%x%x)",function (h) --将%xx转换为相应的字符
                       return string.char(tonumber(h,16))        
                    end)
        return s
    end
    
    print(unescape("a%2Bb+%3D+c"))    -->a+b = c

    用gmatch对name = value进行解码。由于名称和值都不能包含"&"和"=",所以可以用模式"[^&=]+"来匹配它们:

    cgi = {}
    function decode(s)
        for name,value in string.gmatch(s,"([^&=]+)=([^&=]+)") do
            name = usecape(name)
            value = unescape(value)
            cgi[name] = value
        end
    end

    对于每组参数,迭代器都会将捕获到的内容作为变量name和value的值。循环体内只是对两个字符串调用unescape,然后将结果保存cgi表中。

      另一方面,编码函数也容易写。首先,写一个escape函数:将所有特殊字符编码为"%"并伴随该字符的十六进制码。将空格转换为"+"

    function escape(s)
        s = string.gsub(s,"[&=+%%%c]",function(c) --匹配"&"、"="、"+"、"%"和"%c"控制符,并用function把它转换为%xx形式。
                        return string.format("%%%02X",string.byte(c)) --
                    end)
        s = string.gsub(s," ","+") --转换空格为"+"
        return s
    end

    encode函数遍历整个待编码的table,构建出最终的结果字符串:

    function encode(t)
        local b = {}
        for k,v in pairs(t) do
            b[#b + 1] = (escape(k) .. "=" .. escape(v))
        end
        return table.concat(b,"&")
    end
    
    t = {name = "al", query = "a+b = c",q = "yes or no"}
    print(encode(t)) -->q=yes+or+no&query=a%2Bb+%3D+c&name=al

    以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》 

  • 相关阅读:
    最大子段和之可交换
    最大子段和之M子段和
    前端开发-日常开发沉淀之生产环境与开发环境
    开发技巧-解决打开谷歌浏览器跳转问题
    前端调试-跨域解决方式
    postman自动化,测试脚本
    自动化脚本测试,postman使用沉淀
    HMAC-SHA256 签名方法各个语音的实现方式之前端JavaScriptes6
    React中redux表单编辑
    前端JavaScript获取时间戳
  • 原文地址:https://www.cnblogs.com/daiker/p/5915179.html
Copyright © 2011-2022 走看看