lua 编码转码url

原创 2012年12月26日 21:25:20

local url={parsed={}} --存储decode出来的key-value

--private
local function escape(w)
	pattern="[^%w%d%._%-%* ]"
	s=string.gsub(w,pattern,function(c)
		local c=string.format("%%%02X",string.byte(c))
		return c
	end)
	s=string.gsub(s," ","+")
	return s
end

local function detail_escape(w)
	local t={}
	for i=1,#w do
		c = string.sub(w,i,i)
		b,e = string.find(c,"[%w%d%._%-'%* ]")
		if not b then
			t[#t+1]=string.format("%%%02X",string.byte(c))
		else
			t[#t+1]=c
		end
	end
	s = table.concat(t)
	s = string.gsub(s," ","+")
	return s
end

local function unescape(w)
	s=string.gsub(w,"+"," ")
	s,n = string.gsub(s,"%%(%x%x)",function(c)
		return string.char(tonumber(c,16))
	end)
	return s
end

---[=[
--public function
function url:new()
	local u={}    --对象
	u.old= nil    --上一次decode 字符串的值
	u.de = nil    --decode字符串后的结果值
	u.en = nil    --encode字符串后的结果值
	u.enold = nil --上一次encode 字符串的值
	u.len = 0     --记录parsed map的长度


	--设置metatable
	setmetatable(u,{__index=self})
	return u
end

function url:decode(line)
	assert(line == nil or type(line) == "string")
	if self.old == line then return print("url:decode have cache") ,self.de end
	if not line then return self.de end

	self.parsed=nil
	self.len = 0
	self.parsed={}
	for k,v in string.gmatch(line,"([^&=]+)=([^&=]+)") do
		self.len = self.len + 1
		self.parsed[k] = unescape(v)
	end

	if  self.len == 0 then return nil  end

	local r={}
	for k,v in pairs(self.parsed) do
		r[#r+1] = k.."="..v
	end
	self.de=table.concat(r,"&")
	self.old=line
	return self.de
end

function url:encode(t)
	if(type(t) == "string") then
			if t == self.enold then
				print("url:encode have cache")
				return self.en
			end

			local r={}
			for k,v in string.gmatch(t,"([^&=]+)=([^&=]+)") do
				r[#r+1] = escape(k) .."=".. escape(v)
			end
			self.en = table.concat(r,"&")
			self.enold = t
			return self.en
	elseif type(t) ~= "table" then return nil
	else
		local r = {}
		for k , v in pairs(t) do
			r[#r+1] = escape(k) .."=".. escape(v)

		end
		self.en = table.concat(r,"&")

		return self.en
	end
end

function url:parse(line)
	assert(line == nil or type(line) == "string")
	if not line then
		if self.len == 0 then return nil
		else return self.parsed end
	end
	if url:decode(line) == nil then return nil end
	return self.parsed
end

function url:get(k)
	if self.len > 0 then
		return self.parsed[k]
	else
		return nil
	end
end

--测试私有函数
test="泰囧<>2a+b=c.*!^()"
test2="tn=baiduhome_pg&ie=utf-8&bs=lua%26%3D+%E5%8C%B9%E9%85%8D%E6%B1%89%E5%AD%97&f=8&rsv_bp=1&rsv_spt=1&wd=%E6%B3%B0%E5%9B%A7%3C%3E2a%2Bb+%3D+c.*%21%5E%28%29&rsv_n=2&rsv_sug3=1&rsv_sug1=1&rsv_sug4=168&inputT=897"
---[[
io.write("test private funcitons\n")
io.write("test:",test,"\n")
io.write("结果:",escape(test),"\n")
io.write("结果:",detail_escape(test),"\n")
dec=detail_escape(test)
io.write("结果:",unescape(dec),"\n")
--]]
--测试公有函数
show = function(m)
	if not m then io.write("empty")
	elseif type(m) == "string" then
		io.write(m)
	elseif type(m) == "table" then
		for k,v in pairs(m) do
			io.write(string.format("k=%-10s  v=%s\n",k,v))
		end
	else
		io.write("unkown")
	end
	io.write("\n")
end

io.write("test public funcitons\n")
local u = url:new()
io.write("encode(test):");show(u:encode(test))
io.write("encode(test2):");show(u:encode(test2))
io.write("decode(encode(test)):");show(u:decode(u:encode(test)))
io.write("decode(test2):");show(u:decode(test2))
io.write("decode(test2):");show(u:decode(test2))
io.write("encode(test2):");show(u:encode(test2))
io.write("parse(encode(test2)):");show(u:parse(u:encode(test2)))
io.write("encode(map):"); show(u:encode({a="x + 3*10 << 1&2",b="q=queryWord!"}))
io.write("decode(encode(map):");show(u:decode(u:encode({a="x + 3*10 << 1&2",b="q=queryWord!"})))
print("decode test2:",test2);
d=u:decode(test2)
print("decode test2 ret:",d);
print("encode d:",d)
e=u:encode(d)
print("encode d ret:",e)
p=u:parse(e)
show(p)
io.write("parse:");show(u:parse(u:encode(u:decode(test2))))

io.write("get f:");show(u:get("f"))
io.write("get a  :");show(u:get("a"))
io.write("get tn :");show(u:get("tn"))
io.write("get bw :");show(u:get("bw"))
io.write("get cda:");show(u:get("cda"))

return url
--]=]

就利用string的正则匹配操作url进行编码和转换,空格转成'+',而不是%20,这主要和浏览器转一样。

做成了一个模块,可以直接用,下面看代码


Lua编码的那些陷阱

字符串连接符 “..” 当需要把多个小字符串拼接成一个大串的时候,例如,从一个sql结果集中取某列元素并将该元素组成以‘/’分割的字符串。 如果sql结果集是上万行,那么就会发现效率越来越低。这性...
  • xfnjlove
  • xfnjlove
  • 2015年04月16日 15:43
  • 1439

lua 解析url

 --获取路径 function stripfilename(filename)          return string.match(filename, "(.+)/[^/]*%.%w...
  • yangzhenzhen
  • yangzhenzhen
  • 2014年04月11日 13:47
  • 4863

lua之urlEncode和urlDecode方法。

local function urlEncode(s) s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format...
  • zwcwu31
  • zwcwu31
  • 2016年08月30日 17:44
  • 3692

lua urlencode urldecode URL编码

URL编码其实就是对一些字符转义为%加上对应ASCSS
  • luoyue123321
  • luoyue123321
  • 2014年06月26日 15:28
  • 11116

在nginx中采用lua对请求的url进行hash取模

目前有一个需求,是需要将nginx反向代理的后端响应的内容进行缓存,并且要平均的分配到10个自定义的目录中。一说到,自动分配的需求,采用hash取模是最常用也是最简单的方案,其中选择hash的字段(内...
  • linsongze2011
  • linsongze2011
  • 2015年03月30日 15:28
  • 4051

常用Lua开发库-JSON库、编码转换、字符串处理

文章来源: 1 常用Lua开发库-JSON库、编码转换、字符串处理文章原地址 http://jinnianshilongnian.iteye.com/blog/2187643 前言 对...
  • u013412772
  • u013412772
  • 2018年01月07日 19:48
  • 46

LUA乱码的解决

乱码常常是因为编码不一致导致乱码的!!如在A环境使用编码1,而B环境使用的是编码2,则在B环境看到的将是乱码!!          LUA中,local t = "呵呵",在Sublime中使用U...
  • woshiyuanlei
  • woshiyuanlei
  • 2016年12月27日 16:08
  • 4017

lua url转译

ngx.escape_uri(str) url转义 ngx.unescape_uri(str) url转义还原ngx.encode_args() ...
  • xiejunna
  • xiejunna
  • 2017年07月20日 14:10
  • 363

JavaScript url 编码转换

在Web应用中经常会发现碰到被编码的字符串,看起来很费劲,这里提供一个简单的编解码程序,可以方便地查看原码或转码: unescape,decodeURI // ...
  • hongweigg
  • hongweigg
  • 2016年07月07日 19:22
  • 1124

lua 代码题目

楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法。递归求解,table的使用function Way(n) local ans = {} if n == 1 ...
  • qq_26437925
  • qq_26437925
  • 2016年12月13日 16:24
  • 714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lua 编码转码url
举报原因:
原因补充:

(最多只允许输入30个字)