Lua http_build_query

SheepShon

Известный
Автор темы
22
9
Версия MoonLoader
.026-beta
Здравствуйте, не получается преобразовать запрос с русскими символами пробелами :(

Использую эту функцию..
Описание: аналог функции из PHP http_build_query. Из таблицы составляет url запрос
Код:
Lua:
function char_to_hex(str)
  return string.format("%%%02X", string.byte(str))
end

function url_encode(str)
  local str = string.gsub(str, "\\", "\\")
  local str = string.gsub(str, "([^%w])", char_to_hex)
  return str
end

function http_build_query(query)
  local buff=""
  for k, v in pairs(query) do
    buff = buff.. string.format("%s=%s&", k, url_encode(v))
  end
  local buff = string.reverse(string.gsub(string.reverse(buff), "&", "", 1))
  return buff
end
Пример использования:
Lua:
http_build_query({a = "привет\nсобака", c = "я люблю писать русский текст с пробелами"})
Вернет:
Код:
a=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%0A%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%D0%B0&c=%D1%8F%20%D0%BB%D1%8E%D0%B1%D0%BB%D1%8E%20%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D1%81%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8

Вставил всё точь-в-точь как в примере, но выходит что то не то.
Lua:
require "lib.moonloader"

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("test", cmdTest)
    
    while true do wait(0)
    end
end

function cmdTest()
    print(http_build_query({a = "привет\nсобака", c = "я люблю писать русский текст с пробелами"}))
end

function char_to_hex(str)
  return string.format("%%%02X", string.byte(str))
end

function url_encode(str)
  local str = string.gsub(str, "\\", "\\")
  local str = string.gsub(str, "([^%w])", char_to_hex)
  return str
end

function http_build_query(query)
  local buff=""
  for k, v in pairs(query) do
    buff = buff.. string.format("%s=%s&", k, url_encode(v))
  end
  local buff = string.reverse(string.gsub(string.reverse(buff), "&", "", 1))
  return buff
end

Вот что выводит в консоль.
Lua:
a=3.401509E-19F0.00000003.401509E-1983.401509E-1923.401509E-1950.00000020X0.0000000000000P+00.00000010.000000E+00E0.000000E+0010.000000E+0000.000000E+00A0.000000E+000&c=0.000000F2.121996E-312B0.000000E0.000000E+0010.000000E+00B0.000000E2.471080E-312F0.000000E+0080.00000010.000000E+0000.00000020.000000C0.00000000.00000030.00000010.00000010.000000E+00A0.000000E+0080.000000E+0090.00000020.000000E+0050.000000E+00A0.00000010.00000020.00000010.000000E+00F0.00000000.000000E+00E0.000000E+0010.000000E+0050.000000E+00B0.000000E+0000.000000E+00C0.000000E+008
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,145
Lua:
local function a(b)return string.format("%%%02X",string.byte(b))end;local function c(b)local b=string.gsub(b,"\\","\\")local b=string.gsub(b,"([^%w])",a)return b end;local function d(e)local f=""for g,h in pairs(e)do if type(h)=='table'then for i,j in ipairs(h)do f=f..string.format("%s[]=%s&",g,c(j))end else f=f..string.format("%s=%s&",g,c(h))end end;local f=string.reverse(string.gsub(string.reverse(f),"&","",1))return f end
print(d({a = "привет\nсобака", c = "я люблю писать русский текст с пробелами"}))
Код:
a=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%0A%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%D0%B0&c=%D1%8F%20%D0%BB%D1%8E%D0%B1%D0%BB%D1%8E%20%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D1%81%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8
 

SheepShon

Известный
Автор темы
22
9
Lua:
local function a(b)return string.format("%%%02X",string.byte(b))end;local function c(b)local b=string.gsub(b,"\\","\\")local b=string.gsub(b,"([^%w])",a)return b end;local function d(e)local f=""for g,h in pairs(e)do if type(h)=='table'then for i,j in ipairs(h)do f=f..string.format("%s[]=%s&",g,c(j))end else f=f..string.format("%s=%s&",g,c(h))end end;local f=string.reverse(string.gsub(string.reverse(f),"&","",1))return f end
print(d({a = "привет\nсобака", c = "я люблю писать русский текст с пробелами"}))
Код:
a=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%0A%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%D0%B0&c=%D1%8F%20%D0%BB%D1%8E%D0%B1%D0%BB%D1%8E%20%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D1%81%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8

тоже самое выводит опять эти цифры
Lua:
a=3.401509E-19F0.00000003.401509E-1983.401509E-1923.401509E-1950.00000020X0.0000000000000P+00.00000010.000000E+00E0.000000E+0010.000000E+0000.000000E+00A0.000000E+000&c=0.000000F2.121996E-312B0.000000E0.000000E+0010.000000E+00B0.000000E2.471080E-312F0.000000E+0080.00000010.000000E+0000.00000020.000000C0.00000000.00000030.00000010.00000010.000000E+00A0.000000E+0080.000000E+0090.00000020.000000E+0050.000000E+00A0.00000010.00000020.00000010.000000E+00F0.00000000.000000E+00E0.000000E+0010.000000E+0050.000000E+00B0.000000E+0000.000000E+00C0.000000E+008