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 》 

posted @ 2016-09-28 09:31  daiker  阅读(173)  评论(0编辑  收藏  举报