Chapter 21_5.1 URL编码
Posted daiker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 》
以上是关于Chapter 21_5.1 URL编码的主要内容,如果未能解决你的问题,请参考以下文章