Перекодировка в LUA

Страницы: 1
RSS
Перекодировка в LUA
 
Вопрос сообществу.
Как средствами луа перекодировать строку?
Это на входе в луа (данные пинга):
Скрытый текст
Что это за кодировка, я не силен, но, наверное, Windows))
В самой командной строке шрифт русский, все нормально. Но скрипт с луа на выходе кириллицу не дает.
Как перекодировать и получить кириллицу?
 
Взять нотепад и Save As
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
я имею в виду в скрипте, чтобы в лог его кинуть в нормальном виде
 
сохранить не в UTF-8 w/o BOM, а просто в ANSI
 
Что значит сохранить? Я не вполне понимаю.
Скрипт пингует айпишник. Получает строку с вышеуказанным содержимым. Я хочу с этой строки взять нужные данные (полбеды, решаемо) но и хочу её в нормальной кодировке, в которой луа и выдает строки в файл и в дебугвью, выдать в лог. А получаются - кроказябры. Посреди нормально читаемого лога вот эта хрень.
Отсюда и вопрос, как перекодировать строку и выдать её в читаемом виде?
 
Вот сама функция, взята из примера, на который навел Сергей Горохов

Код
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
 
она и пингует
 
http://lua-users.org/wiki/LuaUnicode
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Михаил, спасибо за наводку, но у меня не работает пример. Ругается на bit32.
Судя по всему надо подключать какие то библиотеки, в луа 5.3 она уже включена, но как его доустановить - понять не могу да и будет ли это работать в квике - не знаю. У меня стоит 5.1, ставил вроде без танцев с бубном. Скажите, эту библиотеку можно отдельно подключить? как это сделать, если она уже в составе сборки? Для меня работа с библиотеками - темный лес, ничего не понимаю((
Может, есть другой способ решения моей задачи?
 
Скрипт библиотеки нашел, скопировал, но не работает. Разобраться сам не могу.
Кто-нибудь еще знает способы перекодировки? Был бы признателен за, может, более явную наводку.
 
Пошел другим путем.
Если в командной строке перед пингом ввести chcp 861, то сообщения пойдут на англицком. Если потом chcp 866, вернется кодировка русская.
Вопрос, как в указанном выше скрипте добавить исполнение chcp 861? Чтоб не новая "сессия" командной строки начиналась, а в составе той, что с пингом?
 
Код
io.popen('chcp 1251 && ping www.quik.ru')
Но это не помогает
Надо делать так, как надо. А как не надо - делать не надо.
 
надо 861. Не понял что значит &&? пока вставляю не работает, может, синтаксис не понимаю
 
Цитата
Viktor MMM пишет:
Не понял что значит &&?
Это значит:
Цитата
Viktor MMM пишет:
Чтоб не новая "сессия" командной строки начиналась, а в составе той, что с пингом
Выполните в командной строке - поймёте.
Надо делать так, как надо. А как не надо - делать не надо.
 
Понял, спасибо.
Да, не пашет(
 
Цитата
Viktor MMM пишет:
Вопрос, как в указанном выше скрипте добавить исполнение chcp 861? Чтоб не новая "сессия" командной строки начиналась, а в составе той, что с пингом?
А если написать командный файл и запускать его?
 
Цитата
s_mike@rambler.ru пишет:
http://lua-users.org/wiki/LuaUnicode
за ссылку - спасибо. Займусь переводом))
 
Цитата
Viktor MMM пишет:
Понял, спасибо.
Да, не пашет(
Собственно, а зачем Вам перекодировка ради одного единственного результата команды ping?
Цифровые значения Вы выдернуть можете, а весь остальной текст там является константой.
Просто произведите замену текста на читаемый и все.
 
Да это понятно, что в данном случае можно и так обойтись. Но я хочу сделать по-человечески. Сообщения могут отличаться. И гадать что там не хочу. Уже почти нашел решение, упускаю перекодировку, перевожу на английский - устроит вполне. Дело осталось за запуском двух команд в одной сессии командной строки. Если подскажете как это сделать, буду признателен.
 
Код
io.popen('echo |chcp 1251|dir')  
io.popen('echo |chcp 861|ping www.quik.ru')

Что интересно, с dir можно и на русском, а ping на русском не получается.

Viktor MMM, с вас - парсер результатов вывода. А то мне лень самому делать.
Надо делать так, как надо. А как не надо - делать не надо.
 
При выполнении команды
Код
io.popen('echo |chcp 1251|echo тест')
я получаю через раз, то
Цитата

тест
то
Цитата

вҐбв
Как это можно объяснить?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель пишет:
Код
 io.popen('echo |chcp 1251|dir')  
io.popen('echo |chcp 861|ping www.quik.ru') 

Что интересно, с dir можно и на русском, а ping на русском не получается.

Viktor MMM , с вас - парсер результатов вывода. А то мне лень самому делать.
Отлично! Спасибо большое! Не догадался бы так сделать. То, что не пишет на русском, я не расстраиваюсь. Подойдет и английский. Читал на просторах, что луа под кириллицу плохо заточен, так что дальше в этом направлении и копать не буду. Результат читабельный, можно смело кидать в лог, вытаскивать нужные данные, проверять - в сервере дело или в инете.

Что за парсер вас интересует? В смысле, вытащить отдельно % потерь или еще чего? Скажите, сделаю.
 
Цитата
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'))
 
Страницы: 1
Читают тему
Наверх