Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Аватара пользователя
x_seed@vk

Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение x_seed@vk »

Добрый вечер, уважаемые форумчане! Есть файл out.txt, сохраненный в кодировке 65001 (UTF-8) через AkelPad. При попытке выполнить



Код:

Код: Выделить всё

chcp 65001 && cat out.txt | c:\nncron\GnuWin32\bin\iconv.exe

Текст в консоль выводится нормально. А при выполнении



Код:

Код: Выделить всё

chcp 65001 && cat out.txt | c:\nncron\GnuWin32\bin\iconv.exe > out2.txt

файл out2.txt при открытии AkelPad'ом в строке состояния определяется как 1251 (ANSI - кириллица). Как сделать, чтобы выходной файл out2.txt был в той же кодировке, что и входной?



В 1251 я работал с буфером обмена при помощи getclip.exe. Но в связи с тем, что он
не поддерживает
UTF-8,



Код:

Код: Выделить всё

chcp 65001 && getclip.exe

в консольное окно ничего не выводят. Хотелось бы найти достойную замену getclip. Попробовал nclip, но при chcp 65001 он выводит в консоль квадратики и портит кодировку у символа ö (cmd.jpg):



Код:

Код: Выделить всё

c:\nncron>chcp 65001 && nclip -o | c:\nncron\GnuWin32\bin\iconv.exe
Active code page: 65001
<tr xmlns="http://www.w3.org/1999/xhtml"><td align="left" nowrap=""><small>��������</small></td></tr>
<tr xmlns="http://www.w3.org/1999/xhtml"><td><select multiple="multiple" class="or done chosen" style="width: 236px; display: none;" id="props_manufilter" name="props_manufilter">
<option value="">���</option>
<option value="13562">AEG</option>
<option value="13564">Bomann</option>
<option value="13565">Bosch</option>
<option value="14021">Campingaz</option>
<option value="14098">Char-Broil</option>
<option value="13382">Clatronic</option>
<option value="13581">Cloer</option>
<option value="14045">Cuisinart</option>
<option value="13582">DeLonghi</option>
<option value="13849">DS Produkte</option>
<option value="13833">Efbe Schott</option>
<option value="11090">Electrolux</option>
<option value="10404">Grundig</option>
<option value="13568">Krups</option>
<option value="14028">Landmann</option>
<option value="14016">Lotus Grill</option>
<option value="12139">Medion</option>
<option value="13684">Petra</option>
<option value="10213">Philips</option>
<option value="13609">Rommelsbacher</option>
<option value="13881">Rosle</option>
<option value="13698">Russell Hobbs</option>
<option value="13836">Salco</option>
<option value="13611">Severin</option>
<option value="13742">Siemens</option>
<option value="13667">Steba</option>
<option value="13715">Suntec</option>
<option value="13572">Tefal</option>
<option value="10315">Thomson</option>
<option value="13573">Unold</option>
<option value="10184">Verschiedene</option>
</select></td></tr>

а в файл



Код:

Код: Выделить всё

c:\nncron>chcp 65001 && nclip -o | c:\nncron\GnuWin32\bin\iconv.exe > out3.txt

- то же самое - 1251 (ANSI - кириллица), но при этом AkelPad в отличие от cmd, видит русские символы.



Так как же добиться, чтобы из буфера обмена передавался Unicode в окно командной строки?

Я пока нашел такой способ: вставкой в окно cmd через Right MB. Шрифт в cmd выбран "Lucida console".



Код:

Код: Выделить всё

c:\nncron>chcp
Active code page: 65001
c:\nncron><option value="13881">Rösle</option>
The syntax of the command is incorrect.
c:\nncron>chcp 1251
Текущая кодовая страница: 1251
c:\nncron><option value="13881">Rösle</option>
Ошибка в синтаксисе команды.

но я при этом в недоумении, т.к. вставка проходит вполне корректно и при chcp 1251, хотя там нет символа ö. Изображение ()cmd2.jpg

Но мне надо, чтобы это делало какое-либо консольное приложение для работы с буфером обмена. Как это сделать?
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
x_seed@vk

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение x_seed@vk »

Foreigner, Kazun, только сейчас заметил, что длина строки в output ограничена шириной буфера экрана cmd. Можно как-то снять это ограничение?

Попробовал настроить Microsoft.PowerShell_profile, указав в нем значение $buffer.Width = 99999 (большее 9999), но при старте консоли PS:

Код:

Код: Выделить всё

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
Exception setting "BufferSize": "Cannot set the buffer size because the size specified is too large or too small.
Parameter name: value
Actual value was 99999,9999."
At C:\Users\054\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:6 char:10
+ $console. <<<< BufferSize = $buffer
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

Вы что-нибудь знаете о причинах такого поведения powershell? Как сделать так, чтобы при исполнении

Код:

Код: Выделить всё

c:\>powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()" > out.txt

в текстовом файле строки не ограничивались длиной, равной ширине буфера консоли?
Аватара пользователя
Foreigner

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение Foreigner »

Цитата Foreigner:



A iconv зачем?



Не знаю, без iconv текст помещается в консоль кодированным. Если в файле исходная кодировка UTF-8, то при использовании команды cat без iconv он кодируется однобайтной кодировкой (по-видимому Windows-1251) (наверное, это такая реализация unixutils cat.exe, но это лишь мое предположение).



Код:

Код: Выделить всё

c:\nncron>chcp 65001 && cat out.txt
Active code page: 65001
<tr xmlns="http://www.w3.org/1999/xhtml"><td align="left" nowrap=""><small>водитель</small></td></tr>
<tr xmlns="http://www.w3.org/1999/xhtml"><td><select multiple="multiple" class="or done chosen" style="width: 236px; display: none;" id="props_manufilter" name="props_manufilter">
<option value="">РІСЃРµ</option>
<option value="13562">AEG</option>
<option value="13564">Bomann</option>
<option value="13565">Bosch</option>
<option value="14021">Campingaz</option>
<option value="14098">Char-Broil</option>
<option value="13382">Clatronic</option>
<option value="13581">Cloer</option>
<option value="14045">Cuisinart</option>
<option value="13582">DeLonghi</option>
<option value="13849">DS Produkte</option>
<option value="13833">Efbe Schott</option>
<option value="11090">Electrolux</option>
<option value="10404">Grundig</option>
<option value="13568">Krups</option>
<option value="14028">Landmann</option>
<option value="14016">Lotus Grill</option>
<option value="12139">Medion</option>
<option value="13684">Petra</option>
<option value="10213">Philips</option>
<option value="13609">Rommelsbacher</option>
<option value="13881">RГ¶sle</option>
<option value="13698">Russell Hobbs</option>
<option value="13836">Salco</option>
<option value="13611">Severin</option>
<option value="13742">Siemens</option>
<option value="13667">Steba</option>
<option value="13715">Suntec</option>
<option value="13572">Tefal</option>
<option value="10315">Thomson</option>
<option value="13573">Unold</option>
<option value="10184">Verschiedene</option>
</select></td></tr>


Цитата Foreigner:



взять из буфера обмена можно с помощью powershell:

Код: Выделить весь код

powershell -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"
Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке




Что-то у меня не выводится текст из буфера обмена в консоль powershell с помощью вашей команды. Прилагаю скриншот. Как вы это делаете? Я просто новичок в powershell...
Аватара пользователя
x_seed@vk

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение x_seed@vk »

Цитата x_seed@vk:



chcp 65001 && cat out.txt
Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке




А нафига извращаться с cat.exe, нельзя как все простые люди использовать type?



Код:

Код: Выделить всё

chcp 65001
type out.txt


Цитата x_seed@vk:



Как вы это делаете?
Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке




Так и делаю, почему у вас не работает не знаю.
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
Foreigner

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение Foreigner »

Запустить powershell с параметром -STA(powershell -sta):



Код:

Код: Выделить всё

powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"
Аватара пользователя
Kazun

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение Kazun »

Запустить powershell с параметром -STA(powershell -sta):

Код:

Код: Выделить всё

powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"
Аватара пользователя
Foreigner

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение Foreigner »

Kazun, А по умолчанию разве не STA?

Код:

Код: Выделить всё

 > [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace | ft version, apartmentstate -auto
Version ApartmentState
------- --------------
4.0                STA
Аватара пользователя
Kazun

Re: Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке

Сообщение Kazun »

Цитата Kazun:



Запустить powershell с параметром -STA
Любой язык - [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке




Kazun, сделал как вы сказали, помогло, сразу вывел строки из clipboard в cmd в нужной кодировке:



Код:

Код: Выделить всё

c:\nnCron>chcp 65001
Active code page: 65001
c:\nnCron>powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"
<tr><td nowrap="" align="left"><small>итель</small></td></tr>
<tr><td><select name="props_manufilter" id="props_manufilter" style="width: 236
px; display: none;" class="or done chosen" multiple="multiple">
<option value="">все</option>
<option value="13562">AEG</option>
<option value="13564">Bomann</option>
<option value="13565">Bosch</option>
<option value="14021">Campingaz</option>
<option value="14098">Char-Broil</option>
<option value="13382">Clatronic</option>
<option value="13581">Cloer</option>
<option value="14045">Cuisinart</option>
<option value="13582">DeLonghi</option>
<option value="13849">DS Produkte</option>
<option value="13833">Efbe Schott</option>
<option value="11090">Electrolux</option>
<option value="10404">Grundig</option>
<option value="13568">Krups</option>
<option value="14028">Landmann</option>
<option value="14016">Lotus Grill</option>
<option value="12139">Medion</option>
<option value="13684">Petra</option>
<option value="10213">Philips</option>
<option value="13609">Rommelsbacher</option>
<option value="13881">Rösle</option>
<option value="13698">Russell Hobbs</option>
<option value="13836">Salco</option>
<option value="13611">Severin</option>
<option value="13742">Siemens</option>
<option value="13667">Steba</option>
<option value="13715">Suntec</option>
<option value="13572">Tefal</option>
<option value="10315">Thomson</option>
<option value="13573">Unold</option>
<option value="10184">Verschiedene</option>
</select></td></tr>

Спасибо за совет!

Видать, pclip, nclip, getclip, clop и иже с ними делались исключительно под определенную кодовую страницу и не предназначены для работы с Unicode. А вот PowerShell с его gettext() способен это сделать.

Проблему с кодировкой при выводе в файл решил, по-видимому, при открытии файла AkelPad пытается ее распознать и у него не всегда это корректно получается, особенно, когда в файле байты разных алфавитов и пытается подобрать что-то свое. При установке кодировки в Akelpad вручную (ПКМ по строке состояния) все прекрасно распознается.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»