Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Обсуждение программ nnCron и nnCron LITE

Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Tue, 30 Jun 2015, 06:42

Приветствую всех, уважаемые форумчане! Никак не могу разрешить следующую проблему. Имеется текстовый файл следующего содержания:
Производитель</small></td></tr><option value="13881">Rösle</option>

(_ttps://yadi.sk/i/stZ8H3afhZaBe), сохраненный AkelPad'ом в кодировке 65001 (UTF-8). Из него я копирую текст в буфер Windows 7 x64. Далее мне нужно его подать из буфера на STDOUT для обработки стандартными программами из пакета unixutils. Я, к сожалению, не нашел никаких толковых путей, как это сделать. Поскольку в Форте я не силен, решил обходиться сторонними консольными программами из бесплатных пакетов unixutils, cygwin и Windows Resource Kit, которые работают с буфером, но и с ними никак не получается, потому что искажается кодировка текста при выводе (вставке) в окно CMD. Установил шрифт Lucida Console. Выставил кодовую страницу 65001:
Code: Select all
c:\nncron>chcp 65001
Active code page: 65001

c:\nncron>getclip

c:\nncron>clop
�ந�����⥫�</small></td></tr><option value="13881">Rosle</option>

c:\nncron>pclip
�������������</small></td></tr><option value="13881">Rosle</option>

c:\nncron>nclip -o
�������������</small></td></tr><option value="13881">Rosle</option>

(getclip в окно консоли ничего не выдал). Ради интереса посмотрел, как данные программы работают в других кодовых страницах:
Code: Select all
c:\nncron>chcp 1251
Текущая кодовая страница: 1251

c:\nncron>getclip
Производитель</small></td></tr><option value="13881">Rosle</option>

c:\nncron>clop
Џа®Ё§ў®¤ЁвҐ«м</small></td></tr><option value="13881">Rosle</option>

c:\nncron>pclip
Производитель</small></td></tr><option value="13881">Rosle</option>

c:\nncron>nclip -o
Производитель</small></td></tr><option value="13881">Rosle</option>

Исчезли точки в слове Rösle, значит, используется скорей всего однобайтная кодировка и происходит потеря спец. символов. Как видим, с кириллицей дружат только 3 из 4-х, по-видимому clop предназначен только для работы в chcp 866:
Code: Select all
c:\nncron>chcp 866
Текущая кодовая страница: 866

c:\nncron>clop
Производитель</small></td></tr><option value="13881">Rosle</option>

но проблему с Юникодом ни одна из этих 4-х программ не устраняет.

Все же некоторые консольные утилиты поддерживают работу с Юникодом. Вот примеры:
Code: Select all
c:\nncron>chcp 65001
Active code page: 65001

c:\nncron>TYPE out.txt
Производитель</small></td></tr><option value="13881">Rösle</option>

c:\nncron>c:\nncron\GnuWin32\bin\iconv.exe out.txt
���Производитель</small></td></tr><option value="13881">Rösle</option>
incov: о
c:\nncron>cat out.txt
Производитель</small></td></tr><option value="13881">Rösle</option>

c:\nncron>cat out.txt | c:\nncron\GnuWin32\bin\iconv.exe
���Производитель</small></td></tr><option value="13881">Rösle</option>
incov: о

правда и здесь в начале текста видны какие-то служебные данные.

Как же сделать так, чтобы в консоль перенаправлялся Юникод из буфера обмена? Может ли Форт сделать это? Или подскажите сторонний софт, а то уже руки опускаются. Может быть, проблема не в тех четырех программах для чтения из буфера, а какая-то системная проблема? :Hangman: Если бы это была проблема буфера, то почему тогда утилита clip.exe из WRK ведет себя с текстом в UTF-8 нормально, перенаправляя STDIN to CLIPBOARD без проблем с кодировкой?
Code: Select all
c:\nncron>type out.txt | sed -e "s/e/b/g" | clip

Paste:
Производитель</small></td></tr><option valub="13881">Röslb</option>
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby elos » Tue, 30 Jun 2015, 08:51

Ваш случай?

Или CLCL попробовать с unicode-плагином (добавить в форматы руками). Бесплатна.
elos
 
Posts: 665
Joined: Tue, 25 Apr 2006, 11:15

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Tue, 30 Jun 2015, 13:46

Code: Select all
S" Строка CP1251, конвертированная в UTF8" S>UNICODE UNICODE>UTF8 TYPE CR

Code: Select all
S" Строка в CP1251, конвертированная в UTF8 и обратно" S>UNICODE UNICODE>UTF8 UTF8>UNICODE UNICODE>S TYPE CR

Вставка UTF8 в буфер обмена несколько сложнее будет. А какова задача в целом?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Wed, 01 Jul 2015, 03:55


Да, это я писал.
elos wrote:Или CLCL попробовать с unicode-плагином (добавить в форматы руками). Бесплатна.

Э-э, не понял, CLCL имеет интерфейс командной строки?
VoidVolker wrote:
Code: Select all
S" Строка CP1251, конвертированная в UTF8" S>UNICODE UNICODE>UTF8 TYPE CR

Code: Select all
S" Строка в CP1251, конвертированная в UTF8 и обратно" S>UNICODE UNICODE>UTF8 UTF8>UNICODE UNICODE>S TYPE CR

Вставка UTF8 в буфер обмена несколько сложнее будет.

VoidVolker, объясните пожалуйста поподробней, то есть вы предлагаете построчно конвертировать строки в UTF-8 из буфера и передавать их с помощью этих команд на Windows CMD? Я не могу до конца понять, TYPE CR выводит текст вместо экрана на консоль? Но консоль эта своя nncron'овская или может быть любая в т.ч. и cmd.exe? Да и с другой стороны строки с вашим кодом надо писать, я как понимаю, в кронтабе. Можно узнать поподробней, как именно заставить nncron делать вывод в STDOUT на CMD.exe (вместо своей консоли или экрана)?
VoidVolker wrote:А какова задача в целом?

Да задача, если честно, простая. Я копирую html с немецкого сайта в буфер. Далее я хочу его почистить sed'ом от тегов и полученный чистый текст занести снова в буфер, чтобы потом уже использовать по назначению.
Вместо перечисленных выше консольных утилит для работы с буфером мне на форуме OSZone посоветовали функцию gettext() из powershell. Вот в принципе получилась рабочая конструкция:

Code: Select all
c:\nnCron>chcp 65001 && ping -n 2 localhost > nul && powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"

("ping -n 2" нужен для задержки между выполнением команды chcp 65001 и powershell, т.к. кодировка в cmd меняется с задержкой около 1 сек.)
правда уже возникли заморочки с sed'ом, теперь буду думать, как его подружить с Unicode, стандартная sed'ская конструкция для удаления тегов не совсем прокатывает:
Code: Select all
c:\nnCron>chcp 65001 && ping -n 2 localhost > nul && powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()" | sed.exe -e :a -e "s/<[^>]*>//g;/</N;//ba"
���ПроизводительRöslesed.exe: couldn't write 35 items to stdout: No error

матерится, но в принципе отрабатывает, дополнительно возвращая код ошибки. Почему он не может записать 35 символов на STDOUT, и что это за символы, я не могу понять. Тут надо уже курить мануалы по sed.
Готовый однострочник пока получился таким (не уверен, что он совсем правильный из ошибки выше):
Code: Select all
c:\nnCron>chcp 65001 && ping -n 2 localhost > nul && powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()" | sed.exe -e :a -e "s/<[^>]*>//g;/</N;//ba" | clip

spronkin wrote:("ping -n 2" нужен для задержки между выполнением команды chcp 65001 и powershell, т.к. кодировка в cmd меняется с задержкой около 1 сек.)

Чтобы не париться с этим нужно сменить кодировку в консоли для всех сеансов через реестр:
Code: Select all
REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 0xfde9

Тогда задержки не будет и команда будет короче:
Code: Select all
c:\nnCron>powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()" | sed.exe -e :a -e "s/<[^>]*>//g;/</N;//ba" | clip
Last edited by spronkin on Thu, 02 Jul 2015, 17:28, edited 5 times in total.
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Wed, 01 Jul 2015, 13:20

Эмм... А зачем все пропускать через буфер обмена, если файл можно сразу сохранить и sed может работать с файлами? Зачем сед, если ннкрон поддерживает регулярные выражения в полном объеме?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Wed, 01 Jul 2015, 20:47

VoidVolker wrote:Эмм... А зачем все пропускать через буфер обмена, если файл можно сразу сохранить и sed может работать с файлами? Зачем сед, если ннкрон поддерживает регулярные выражения в полном объеме?

Прошу извинить, если ввел вас в заблуждение. Просто файл был в качестве примера источника текста для буфера. На самом же деле я просто копирую текст в буфер с сайта. Интересно, намного ли сложнее будет реализовать обработку текста из буфера с помощью регулярного выражения в nnCron и сильно ли оно изменится по сравнению с sed'овским? И не будет ли текст после его перемещения обратно в буфер с кракозябрами?
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Wed, 01 Jul 2015, 21:28

Например как-то так:
Code: Select all
CLIPBOARD S" /..../" RE-ALL
    <...> \ Обрабатываем текст
;RE-ALL
<...> \ Формируем результат
CLIPBOARD!
Или так
Code: Select all
CLIPBOARD S" /..../" RE-MATCH IF
    <...> \ Обрабатываем текст
THEN
<...> \ Формируем результат
CLIPBOARD!

И вешаем код на хоткей.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby Serjo » Thu, 13 Aug 2015, 13:33

VoidVolker wrote:
Code: Select all
S" Строка CP1251, конвертированная в UTF8" S>UNICODE UNICODE>UTF8 TYPE CR

Code: Select all
S" Строка в CP1251, конвертированная в UTF8 и обратно" S>UNICODE UNICODE>UTF8 UTF8>UNICODE UNICODE>S TYPE CR


Ну вот почему такие "вкусности" не описаны в доках nnCrron - искал решения перевода строки из UTF8 и теперь делаю через стороннюю прогу Tcode (поиск на форуме тоже не вывел на этот пост).
Спасибо огромное! :D
Serjo
 
Posts: 7
Joined: Fri, 13 Dec 2013, 20:08

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Fri, 21 Aug 2015, 09:29

Потому что ннкрон может все. А если чего-то не может - это легко можно добавить. 8)
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Mon, 01 Feb 2016, 04:00

VoidVolker wrote:Эмм... А зачем все пропускать через буфер обмена, если файл можно сразу сохранить и sed может работать с файлами? Зачем сед, если ннкрон поддерживает регулярные выражения в полном объеме?

Извините за позднее продолжение темы, я просто хотел прокомментировать свои действия. Я считаю, что обрабатывать текст в буфере обмена быстрее с той точки зрения, что текст находится не на диске, а в оперативной памяти, поэтому и стараюсь при первом случае использовать CLIPBOARD.
Во-вторых, вы пишете, что nncron поддерживает регулярные выражения в полном объеме. Но я никак не пойму, как можно использовать поиск и замену в строках с помощью regexp? Я правильно понимаю, что с регулярками могут быть использованы только слова RE-MATCH и RE-ALL?
VoidVolker wrote:CLIPBOARD S" /..../" RE-MATCH IF
<...> \ Обрабатываем текст
THEN
<...> \ Формируем результат
CLIPBOARD!

Например, мне требуется вырезать из буфера обмена 4 строку и произвести в ней удаление определенной последовательности символов с начала строки. В sed я делаю это с помощью regexp:
Code: Select all
getclip | sed -e "4!d;s/^3\. [0-9][0-9]//g" | clip

и на выходе получаю результат. В nncron же обработка CLIPBOARD регулярками усложняется на порядок? Или же данную задачу можно сделать проще? Можно ли реализовать обработку строк с помощью regexp по типу поиска и замены по аналогии с sed? Или речь идет не о том объеме? Никак не вижу полноты поддержки regexp nncron в этом плане. Приведите, пожалуйста, пример кода, как данная задача с этой регуляркой будет выглядеть в nncron?
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Mon, 01 Feb 2016, 11:53

spronkin wrote:Извините за позднее продолжение темы, я просто хотел прокомментировать свои действия. Я считаю, что обрабатывать текст в буфере обмена быстрее с той точки зрения, что текст находится не на диске, а в оперативной памяти, поэтому и стараюсь при первом случае использовать CLIPBOARD.

Ааа, ну вот это правильно.

spronkin wrote: В nncron же обработка CLIPBOARD регулярками усложняется на порядок? Или же данную задачу можно сделать проще? Можно ли реализовать обработку строк с помощью regexp по типу поиска и замены по аналогии с sed? Или речь идет не о том объеме? Никак не вижу полноты поддержки regexp nncron в этом плане. Приведите, пожалуйста, пример кода, как данная задача с этой регуляркой будет выглядеть в nncron?

В целом да, если сравнивать данное решение с решением в ннкроне - то да, будет несколько сложнее и больше строк кода.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Tue, 02 Feb 2016, 19:09

Хотелось бы, чтобы в будущих реализациях, например nncron 2.0, появилась бы библиотека или плагин со словами SED GREP TR SORT, которые бы использовали всю мощь базовых утилит Unix и регулярных выражений, направленных на обработку строк nncron.
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Wed, 03 Feb 2016, 01:51

А что мешает их использовать прямо сейчас?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby spronkin » Wed, 03 Feb 2016, 20:02

Да нет, ничто не мешает, просто хочется использовать простые средства для обработки строковых аргументов в nncron, хотя бы поиск и замену.
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Помогите сделать CLIPBOARD to STDOUT в кодировке UTF-8

Postby VoidVolker » Wed, 03 Feb 2016, 21:10

Для простого поиска есть SEARCH, для более сложного - регулярные выражения. Да, замена строк через регулярные выражения несколько сложнее, т.к. сама используемая библиотека довольно старая (по современным меркам) и сложение строк осуществляется тоже с помощью довольно низкоуровневых методов. Проблемы сложения строк без утечек памяти я решил парой соответствующих плагинов. Поиском и заменой через регулярные выражения пользуюсь постоянно и не вижу тут каких-то принципиальных сложностей.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests