Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке (http://forum.oszone.net/showthread.php?t=301778)

x_seed@vk 28-06-2015 21:23 2523482

Не получается перенаправление Clipboard -> STDOUT и STDIN -> File в UTF-8 кодировке
 
Вложений: 3
Добрый вечер, уважаемые форумчане! Есть файл 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, хотя там нет символа ö. :dont-know ()cmd2.jpg
Но мне надо, чтобы это делало какое-либо консольное приложение для работы с буфером обмена. Как это сделать?

x_seed@vk 28-06-2015 21:35 2523490

Вложений: 2
Вот еще 2 файла out.txt и out2.txt

Foreigner 28-06-2015 22:30 2523511

A iconv зачем? взять из буфера обмена можно с помощью powershell:
Код:

powershell -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext()"

x_seed@vk 30-06-2015 00:20 2524063

Вложений: 1
Цитата:

Цитата 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()" »

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

Foreigner 30-06-2015 08:40 2524135

Цитата:

Цитата x_seed@vk
chcp 65001 && cat out.txt »

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

chcp 65001
type out.txt

Цитата:

Цитата x_seed@vk
Как вы это делаете? »

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

Kazun 30-06-2015 09:00 2524148

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

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

Foreigner 30-06-2015 09:31 2524173

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

> [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace | ft version, apartmentstate -auto

Version ApartmentState
------- --------------
4.0                STA


Kazun 30-06-2015 09:36 2524175

Начиная с 4 версии и выше.

Foreigner 30-06-2015 09:37 2524177

Kazun, понятно

x_seed@vk 01-07-2015 03:15 2524478

Цитата:

Цитата Kazun
Запустить powershell с параметром -STA »

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 вручную (ПКМ по строке состояния) все прекрасно распознается.

x_seed@vk 19-12-2015 01:47 2586329

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 19-12-2015 08:55 2586342

Код:

c:\>powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext() | out-file -width 999 out.txt"
Код:

> help out-file -parameter 'width'

-Width <Int32>
    Specifies the number of characters in each line of output. Any additional characters are truncated, not w
    rapped. If you omit this parameter, the width is determined by the characteristics of the host. The defau
    lt for the Windows PowerShell console is 80 (characters).


Iska 19-12-2015 12:18 2586387

Foreigner, то есть, получается, что при перенаправлении неявно работает «Out-File»?

Foreigner 19-12-2015 12:36 2586396

Iska, Просто у него есть параметры по умолчанию, в данном случае ширина строки равна ширине консоли. Параметр width переписывает эти установки. Я так понимаю. А простое перенаправление ">" это и есть out-file без параметров (так вроде объяснял Kazun, могу и ошибаться)

Iska 19-12-2015 12:49 2586403

Цитата:

Цитата Foreigner
А простое перенаправление ">" это и есть out-file без параметров (так вроде объяснял Kazun, могу и ошибаться) »

Я именно про это. Спасибо, ясно.

x_seed@vk 27-12-2015 00:31 2588687

Foreigner, заработало, спасибо, для использования кодировки UTF-8 в выходном файле я использовал доп параметр Encoding.
Код:

powershell -sta -c "add-type -assembly system.windows.forms; [windows.forms.clipboard]::gettext() | out-file -width 20 -Encoding utf8 out.txt"
Только вот параметр -width не работает должным образом. Т.е. вне зависимости от того, какое значение 20 или 999, длина строки в выходном файле получается неограниченной. Что и нужно, но как-то странно срабатывает.
И еще команда help выдает нехватку памяти.
Код:

PS C:\> help out-file -parameter 'width'
Not enough memory.


x_seed@vk 27-12-2015 02:55 2588700

Цитата x_seed@vk:
Видать, pclip, nclip, getclip, clop и иже с ними делались исключительно под определенную кодовую страницу и не предназначены для работы с Unicode. А вот PowerShell с его gettext() способен это сделать. »
Нашел еще одну утилиту paste.exe с http://www.c3scripts.com/tutorials/msdos/paste.html (не путать с paste.exe из unixutils, как я), которая прекрасно справилась с этой задачей. Достаточно выставить codepage в utf8:
Код:

chcp 65001 && paste.exe
и текст выведется на консоль в utf-8, как положено.


Время: 22:39.

Время: 22:39.
© OSzone.net 2001-