Что это за кодировка, я не силен, но, наверное, Windows)) В самой командной строке шрифт русский, все нормально. Но скрипт с луа на выходе кириллицу не дает. Как перекодировать и получить кириллицу?
Что значит сохранить? Я не вполне понимаю. Скрипт пингует айпишник. Получает строку с вышеуказанным содержимым. Я хочу с этой строки взять нужные данные (полбеды, решаемо) но и хочу её в нормальной кодировке, в которой луа и выдает строки в файл и в дебугвью, выдать в лог. А получаются - кроказябры. Посреди нормально читаемого лога вот эта хрень. Отсюда и вопрос, как перекодировать строку и выдать её в читаемом виде?
Вот сама функция, взята из примера, на который навел Сергей Горохов
Код
function backticks_table(cmd)
local tab = {}
local pipe = assert(io.popen(cmd),
"backticks_table(" .. cmd .. ") failed.")
local line = pipe:read("*line")
while line do
table.insert(tab, line)
line = pipe:read("*line")
end
return tab
end
for k, v in ipairs(backticks_table("ping google.com"), k) do
print(v)
end
Михаил, спасибо за наводку, но у меня не работает пример. Ругается на bit32. Судя по всему надо подключать какие то библиотеки, в луа 5.3 она уже включена, но как его доустановить - понять не могу да и будет ли это работать в квике - не знаю. У меня стоит 5.1, ставил вроде без танцев с бубном. Скажите, эту библиотеку можно отдельно подключить? как это сделать, если она уже в составе сборки? Для меня работа с библиотеками - темный лес, ничего не понимаю(( Может, есть другой способ решения моей задачи?
Скрипт библиотеки нашел, скопировал, но не работает. Разобраться сам не могу. Кто-нибудь еще знает способы перекодировки? Был бы признателен за, может, более явную наводку.
Пошел другим путем. Если в командной строке перед пингом ввести chcp 861, то сообщения пойдут на англицком. Если потом chcp 866, вернется кодировка русская. Вопрос, как в указанном выше скрипте добавить исполнение chcp 861? Чтоб не новая "сессия" командной строки начиналась, а в составе той, что с пингом?
Viktor MMM пишет: Вопрос, как в указанном выше скрипте добавить исполнение chcp 861? Чтоб не новая "сессия" командной строки начиналась, а в составе той, что с пингом?
Собственно, а зачем Вам перекодировка ради одного единственного результата команды ping? Цифровые значения Вы выдернуть можете, а весь остальной текст там является константой. Просто произведите замену текста на читаемый и все.
Да это понятно, что в данном случае можно и так обойтись. Но я хочу сделать по-человечески. Сообщения могут отличаться. И гадать что там не хочу. Уже почти нашел решение, упускаю перекодировку, перевожу на английский - устроит вполне. Дело осталось за запуском двух команд в одной сессии командной строки. Если подскажете как это сделать, буду признателен.
Что интересно, с dir можно и на русском, а ping на русском не получается.
Viktor MMM , с вас - парсер результатов вывода. А то мне лень самому делать.
Отлично! Спасибо большое! Не догадался бы так сделать. То, что не пишет на русском, я не расстраиваюсь. Подойдет и английский. Читал на просторах, что луа под кириллицу плохо заточен, так что дальше в этом направлении и копать не буду. Результат читабельный, можно смело кидать в лог, вытаскивать нужные данные, проверять - в сервере дело или в инете.
Что за парсер вас интересует? В смысле, вытащить отдельно % потерь или еще чего? Скажите, сделаю.
Добрый день. Есть более удобные утилиты дл этих целей. Например вот эта - FPing
Код
function os.ping(host)
local f = assert(io.popen('Fping.exe ' ..host .. ' -o', 'r'))
local s = assert(f:read('*a'))
f:close()
return s:sub(s:find('Minimum ='), #s)
end
print(os.ping('localhost'))