Lua query string encoder and parser

Lua
local function enc(s) return (tostring(s):gsub('[^%w%-%._~]', function(c) return ('%%%02X'):format(c:byte()) end)) end
local function dec(s) return (s:gsub('%+', ' '):gsub('%%(%x%x)', function(h) return string.char(tonumber(h, 16)) end)) end

local function parse(qs)
  local out = {}
  for pair in qs:gmatch('[^&]+') do
    local k, v = pair:match('^([^=]*)=(.*)$')
    if not k then k, v = pair, '' end
    out[dec(k)] = dec(v)
  end
  return out
end

local function build(params)
  local parts = {}
  for k, v in pairs(params) do parts[#parts + 1] = enc(k) .. '=' .. enc(v) end
  return table.concat(parts, '&')
end

return { parse = parse, build = build }