2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: idn2 for windows
Сообщение23.05.2018, 17:13 
Зашибись, функция IdnToAscii вообще реализована в kernel32.dll и обращается к RtlIdnToAsccii из ntdll.dll, которая и делает всю работу, ничего лишнего не нужно.
Чувствую щас таки запилю себе утилитку на дельфи с удобными форматами вызова ...

 
 
 
 Re: idn2 for windows
Сообщение23.05.2018, 19:13 
wrest
Сварганил, ссылка (хранится 30 дней после последнего скачивания), исходник и пример запуска приложены: http://files.webi.ru/m_down/idn2.zip.html
Принимает текст или из первого параметра командной строки, или, если та пустая, со стандартного ввода. Одну строку. Пример запуска (кодировка везде консольная OEM=DOS=CP866):
Код:
Z:\>idn2.exe президент.рф
xn--d1abbgf6aiiy.xn--p1ai
Z:\>echo президент.рф|idn2.exe
xn--d1abbgf6aiiy.xn--p1ai
Z:\>
Под вистой и выше ничего не требует, работает как x86/x32 приложение. Под XP не запускается, в kernel32.dll нет функций конвертации, писать самому лень.

 
 
 
 Re: idn2 for windows
Сообщение23.05.2018, 20:48 
Dmitriy40 в сообщении #1314381 писал(а):
Под вистой и выше ничего не требует, работает как x86/x32 приложение. Под XP не запускается,

Спасибо! У меня дома XP и 10-ка, завтра попробую на 7-ке.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 10:26 
Dmitriy40
Работает! Спасибо огромное. И за for -- тоже работает. Написал такой "батник" из одной строки и назвал его idn3.bat:
Код:
for /f %%s in ('idn2 %2') do %1 %%s

Теперь ping, nslookup и проч. можно вызывать им:
Код:
C:\>idn3 nslookup мама.мыла.раму


Ну ясно, что нет в мире совершенства :) А зачем вы сделали так, что если параметров нет, то надо ждать их (ReadLn) до упора?
Мне кажется было бы логично вместо
Код:
   if ParamCount = 0 then begin
      s2 := PChar(StringOfChar(#0, max));
      Readln(s1);
      OemToChar(PChar(s1), s2);
      StringToWideChar(s2, s, max);
   end else

сделать что-то типа
Код:
   if ParamCount = 0 then Writeln('Usage: idn2 domain_name');
       else

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 16:19 
wrest в сообщении #1314525 писал(а):
А зачем вы сделали так, что если параметров нет, то надо ждать их (ReadLn) до упора?
Для таких утилит часто удобно получать строку по конвейеру, ну сравните с тем же find/sort, можно организовывать длинные цепочки команд/фильтров. А уж откуда взять входной поток строк - вариантов множество.

Но Вы правы, хелп это сила, доработал программу до выдачи короткой справки о формате вызова (при вызове без параметров или с параметрами /? или -?), пришлось изменить указание на ожидание входного потока, теперь на это указывает единственный параметр вызова "--". Плюс обрабатывается не одна строка, а все из входного потока или все параметры из командной строки. Плюс на ошибочные строки (например символ табуляции в строке) не выдаёт код ошибки, а молча их пропускает. Ссылка: http://files.webi.ru/m_down/idn2v2.zip.html (предыдущая тоже действует).
Пример вызова:
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
Z:\>idn2
Usage: idn2.exe domain_name [domain_name [domain_name ... ] ]
Or: echo domain_name| idn2.exe --
Or: idn2.exe -- <textfile

Z:\>idn2 президент постпред президент.рф
xn--d1abbgf6aiiy
xn--d1ab0adbgfi
xn--d1abbgf6aiiy.xn--p1ai

Z:\>echo президент.рф| idn2 --
xn--d1abbgf6aiiy.xn--p1ai

Z:\idn2 -- <idn2.sample
xn--d1abbgf6aiiy
xn--d1ab0adbgfi
xn--d1abbgf6aiiy.xn--p1ai

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 16:59 
Dmitriy40 в сообщении #1314601 писал(а):
пришлось изменить указание на ожидание входного потока, теперь на это указывает единственный параметр вызова "--".

Дык перенаправление (которое pipe) работало и так, без "--":
Код:
C:\>idn2 президент.рф
xn--d1abbgf6aiiy.xn--p1ai

C:\>echo президент.рф| idn2
xn--d1abbgf6aiiy.xn--p1ai

C:\>
Просто символ | надо ставить впритык, иначе пробел тоже кодируется

Да, и с вашего позволения, я поделюсь утилитой с коллегами? Так что ещё можете вставить копирайт куда-неть в help (и написать там же что это freeware).

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 17:24 
wrest в сообщении #1314612 писал(а):
перенаправление (которое pipe) работало и так
Вы ж сами просили, чтоб вызов без параметров выдавал справку

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 17:30 
wrest в сообщении #1314612 писал(а):
Да, и с вашего позволения, я поделюсь утилитой с коллегами? Так что ещё можете вставить копирайт куда-неть в help (и написать там же что это freeware).
Разумеется делитесь, выложено же публично (а не Вам лично в ЛС).
Добавлять копирайт и лицензию не вижу смысла, пусть будет общественным достоянием, тем более что никаких гарантий я не даю, а исходный код приложен.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 17:32 
iifat в сообщении #1314621 писал(а):
Вы ж сами просили, чтоб вызов без параметров выдавал справку

Работоспособность pipe (который | ) тут вообще не при чем, кмк.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 17:35 
wrest в сообщении #1314625 писал(а):
Работоспособность pipe (который | ) тут вообще не при чем, кмк.
Да, но вопрос по какому критерию выдавать справку. Могу убрать справку на вызов без параметров (и оставить на /? и -?), думаете будет лучше?

-- 24.05.2018, 18:07 --

Пожалуй да, лучше, даже станет более одинаково с прочими dos командами. Убрал, ссылка: http://files.webi.ru/m_down/idn2v3.zip.html

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 18:29 
Dmitriy40 в сообщении #1314628 писал(а):
Да, но вопрос по какому критерию выдавать справку. Могу убрать справку на вызов без параметров (и оставить на /? и -?), думаете будет лучше?

Я честно сказать не понимаю дилеммы. Вот есть команда ping например. И конвейеры поддерживает и все что надо.

-- 24.05.2018, 18:35 --

Dmitriy40 в сообщении #1314628 писал(а):
Убрал, ссылка:

Не работает если без параметров :)
Вернее работает, но не завершается, выход только по Ctrl+C
Зря вы затеяли вот это:
Dmitriy40 в сообщении #1314601 писал(а):
Плюс обрабатывается не одна строка, а все из входного потока или все параметры из командной строки.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 19:09 
wrest в сообщении #1314643 писал(а):
Я честно сказать не понимаю дилеммы.
Очень просто: что делать при пустой командной строке? Выдавать справку или ждать stdin? И если выдавать справку, то как переключиться на ожидание ввода? В v3 работает ровно как sort, без параметров ждёт ввода, с /? выдаёт справку. Мне бывает удобно использовать pipe, Вы же можете про это забыть и указывать имена в командной строке - и всем будет счастье.

wrest в сообщении #1314643 писал(а):
Вот есть команда ping например. И конвейеры поддерживает и все что надо.
Да ладно, зачем же тогда сами спрашивали как заставить ping принимать данные со ввода, а не из командной строки, а? Так что не поддерживает.

wrest в сообщении #1314643 писал(а):
Зря вы затеяли вот это:
Ну а это просто ничему не мешает и с предыдущим не связано, цикл добавлен в другое место, это просто удобно.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 20:18 
Dmitriy40 в сообщении #1314660 писал(а):
Очень просто: что делать при пустой командной строке? Выдавать справку

Мне кажется что да.
Dmitriy40 в сообщении #1314660 писал(а):
Мне бывает удобно использовать pipe

Извините но я не понимаю при чем тут pipe. Первая версия вашей программы работает с pipe.
Dmitriy40 в сообщении #1314660 писал(а):
Ну а это просто ничему не мешает

Сейчас (v3) если запустить без параметров, то программа ждет ввода, затем конвертирует и опять ждет ввода, и такой режим не заканчивается.

Dmitriy40 в сообщении #1314660 писал(а):
Да ладно, зачем же тогда сами спрашивали как заставить ping принимать данные со ввода, а не из командной строки, а? Так что не поддерживает.

Да, ping не поддерживает, действительно.

 
 
 
 Re: idn2 for windows
Сообщение24.05.2018, 20:39 
wrest в сообщении #1314688 писал(а):
Сейчас (v3) если запустить без параметров, то программа ждет ввода, затем конвертирует и опять ждет ввода, и такой режим не заканчивается.
О, какая красота, очень удобно для тестирования руками. :D И повторю, sort ведёт себя точно так же. Да, ping по другому, ну и что, данная утилита ближе к преобразованию текста, чем к работе с сетью, потому и конвейер, и преобразование "за раз" всего входного потока (или файла через перенаправление), и хелп по /?. Повторю, для утилит работы с текстом это нормально и привычно.

wrest в сообщении #1314688 писал(а):
Извините но я не понимаю при чем тут pipe. Первая версия вашей программы работает с pipe.
Зато не выдаёт справки. Чего Вы же и захотели, ну и я потом тоже.

В общем я готов сделать ровно как Вам нужно, под номером v4 (или уже v5) - если объясните чётко как же Вам хочется. Когда выдавать хелп, когда преобразовывать командную строку (и всю или только первый параметр), когда и надо ли брать строку (или строки?) из входного потока. Как заготовку предлагаю при запуске без параметров выводить хелп, с параметрами - преобразовывать каждый в отдельную строку, на stdin забить, при ошибках молчать. Устраивает или надо как-то ещё по другому - тогда как? Если устраивает, то ссылка: http://files.webi.ru/m_down/idn2v4.zip.html

PS. Кстати начиная с v2 можно запускаемый файл переименовывать как угодно, хелп выдаётся правильно.

 
 
 
 Re: idn2 for windows
Сообщение25.05.2018, 10:02 
Dmitriy40 в сообщении #1314697 писал(а):
Устраивает или надо как-то ещё по другому - тогда как? Если устраивает, то ссылка:

v4 устраивает, огромное спасибо! :!:

 
 
 [ Сообщений: 30 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group