Лингвофорум

Общий раздел => Наука и техника => Компьютеры => Тема начата: Тайльнемер от апреля 26, 2010, 18:21

Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 26, 2010, 18:21
Может кто-то в курсе, как поставить уникод на входном потоке консоли в дот-нетовском консольном приложении?

С выходным всё нормально:
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("əˈjunɪkəʊdˈstɹɪŋ");

Но если написать
Console.InputEncoding = Encoding.UTF8;
string s = Console.ReadLine();
то при вводе строки хотя бы с одним не-ASCII-шным символом s присваевается null.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 18:57
Хм... Я всегда стандартными каналами пользовался, и с ними вроде не было проблем. :donno:
:??? Или я с Жабой путаю?..
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 19:10
А ведь давным-давно я наступал на эти грабли. Эх, я уже не помню, но точно решаемо.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 26, 2010, 20:03
Цитата: myst от апреля 26, 2010, 18:57
Я всегда стандартными каналами пользовался, и с ними вроде не было проблем.
А это они и есть:
Цитата: MSDNConsole Class Represents the standard input, output, and error streams for console applications.
Или не  они?

Цитата: myst от апреля 26, 2010, 19:10
А ведь давным-давно я наступал на эти грабли.
Может, у вас что-то сохранилось, где грабли обойдены?

(Вообще странно как-то: вывод работает, командная строка тоже, а ввод — не хочет)
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 20:06
Цитата: Тайльнемер от апреля 26, 2010, 20:03
Или не  они?
Я, просто, основательно библиотеку Шарпа. :)

Цитата: Тайльнемер от апреля 26, 2010, 20:03
Может, у вас что-то сохранилось, где грабли обойдены?
Сейчас поищу...
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 20:09
Кстати, а зачем UTF-8 в консоли?
По логике вещей надо выставлять кодировку консоли.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 20:10
Например, у меня в консоли 1251, и работает код:

Console.InputEncoding = Encoding.GetEncoding(1251);
string s = Console.ReadLine();
Console.WriteLine(s);
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 26, 2010, 20:12
Если читать из файла с кодировкой UTF-8, должно быть всё нормально.

echo яблоко | iconv -f cp1251 -t utf-8 | ./test

нормально работает с

Console.InputEncoding = Encoding.UTF8;
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 26, 2010, 20:32
Цитата: myst от апреля 26, 2010, 20:09
По логике вещей надо выставлять кодировку консоли.
Например, у меня в консоли 1251
Таки да, пишет, что Console.InputEncoding.WindowsCodePage = 1251. Но это очень странно, ведь я могу, например, написать:
static void Main(string[] args)
         {
         Console.OutputEncoding=Encoding.UTF8;
         if(args.Length>0) Console.WriteLine(args[0]);
         }
обозвать это "ʊñɪçωð.exe", написать в консоли
ʊñɪçωð ѵњѝќѡԃ
и получу строку
ѵњѝќѡԃ

А как такое возможно, если кодировка консоли — 1251?
Название: C#.Консоль.Кодировка
Отправлено: arseniiv от апреля 27, 2010, 13:56
А там же не консоль, а параметр командной строки. Он разве не особенно обрабатывается? Правда, никогда не знал что допускаются юникодные параметры командной строки... :???
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 15:39
Цитата: Тайльнемер от апреля 26, 2010, 20:32
А как такое возможно, если кодировка консоли — 1251?
:donno: Могу лишь сказать, что в XP консоль китайскую грамоту точно не понимает. :)
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 15:41
Цитата: arseniiv от апреля 27, 2010, 13:56
А там же не консоль, а параметр командной строки.
Чо-чо?

Цитата: arseniiv от апреля 27, 2010, 13:56
Он разве не особенно обрабатывается?
Чо?

Цитата: arseniiv от апреля 27, 2010, 13:56
Правда, никогда не знал что допускаются юникодные параметры командной строки... :???
Утро доброе, Windows NT уникод искаропки умеет с незапамятных времён.
Название: C#.Консоль.Кодировка
Отправлено: arseniiv от апреля 27, 2010, 17:42
Я имел ввиду, что параметры командной строки передаются в программу иначе, чем ввод какой-нибудь после запуска
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 27, 2010, 17:54
Цитата: Тайльнемер от апреля 26, 2010, 20:32
А как такое возможно, если кодировка консоли — 1251?
На самом деле в консоли используется другая кодировка кириллицы — cp866 (http://en.wikipedia.org/wiki/CP866). Впрочем, тоже восьмиразрядная.

Непосредственно в консоли, думаю, не получится (хотя линукс, вроде бы, позволяет нечто подобное). Но если создать .bat в формате utf-8 и в нем использовать юникодовские символы в командах, а вывод перенаправить в файл, то, по идее, этот файл будет содержать текст в кодировке utf-8.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 17:57
Цитата: arseniiv от апреля 27, 2010, 17:42
Я имел ввиду, что параметры командной строки передаются в программу иначе, чем ввод какой-нибудь после запуска
Капитан Очевидность в ярости, но я всё равно не понял смысл этого:
Цитата: arseniiv от апреля 27, 2010, 13:56
А там же не консоль, а параметр командной строки.
Слово консоль здесь что означает?
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 17:58
Цитата: Python от апреля 27, 2010, 17:54
На самом деле в консоли используется другая кодировка кириллицы — cp866.
На самом деле это настраивается. У меня 1251, например.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:01
Цитата: Python от апреля 27, 2010, 17:54
Но если создать .bat в формате utf-8 и в нем использовать юникодовские символы в командах, а вывод перенаправить в файл, то, по идее, этот файл будет содержать текст в кодировке utf-8.
Windows'овский интерпретатор команд умеет UTF-8? :o
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:04
Есть код:
ЦитироватьConsole.InputEncoding = Encoding.UTF8;
            string s = Console.ReadLine();

            Console.WriteLine(s ?? "null");

.NET 3.5/Windows XP:
Цитироватьжопа
null

Mono/Ubuntu 10.04:
Цитироватьжопа
жопа

Mono/Windows XP
Цитироватьжопа
null

Кактус!
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 27, 2010, 18:07
Цитата: myst от апреля 27, 2010, 18:01
Windows'овский интерпретатор команд умеет UTF-8?
В именах файлов точно не умеет. Но с утф8 в потоках ввода-вывода, вроде бы, работает.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:16
А почему нельзя задать родную для винды utf16?
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:17
Цитата: Python от апреля 27, 2010, 18:07
Но с утф8 в потоках ввода-вывода, вроде бы, работает.
Команды обработки текста не latin-1 понимают? Если нет, значит не поддерживает.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:18
Цитата: Алексей Гринь от апреля 27, 2010, 18:16
А почему нельзя задать родную для винды utf16?
В консоли? :o
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:21
Цитата: myst от апреля 27, 2010, 18:18
ЦитироватьА почему нельзя задать родную для винды utf16?
В консоли? :o
Хм. Utf8 не пугает, а utf16 пугает? А в чём разница? Неужели они не сделали никаких костылей в ЭМУЛЯТОРЕ консоли для поддержки родного utf16, который внутри кишок винды сидит (даже ascii-функции все к нему же переводятся!) Странно...
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:22
Цитата: Алексей Гринь от апреля 27, 2010, 18:21
Цитата: myst от апреля 27, 2010, 18:18
ЦитироватьА почему нельзя задать родную для винды utf16?
В консоли? :o
Хм. Utf8 не пугает, а utf16 пугает? А в чём разница?
single-byte vs. double-byte. :)
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:23
Цитата: myst от апреля 27, 2010, 18:22
single-byte vs. double-byte. :)
И это существенно для эмулятора? :)
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:25
Цитата: Алексей Гринь от апреля 27, 2010, 18:23
Цитата: myst от апреля 27, 2010, 18:22
single-byte vs. double-byte. :)
И это существенно для эмулятора? :)
Нуль-терминаторы же через байт. ;)
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:26
Цитата: myst от апреля 27, 2010, 18:25
Нуль-терминаторы же через байт. ;)
И?
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 27, 2010, 18:27
Цитата: Алексей Гринь от апреля 27, 2010, 18:21
Цитата: myst от апреля 27, 2010, 18:18
ЦитироватьА почему нельзя задать родную для винды utf16?
В консоли? :o
Хм. Utf8 не пугает, а utf16 пугает? А в чём разница? Неужели они не сделали никаких костылей в ЭМУЛЯТОРЕ консоли для поддержки родного utf16, который внутри кишок винды сидит (даже ascii-функции все к нему же переводятся!) Странно...
Зачем вообще utf16? Она ж зря место расходует, а результат тот же. В чем может быть преимущество?
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:30
Цитата: RawonaM от апреля 27, 2010, 18:27
Зачем вообще utf16? Она ж зря место расходует, а результат тот же. В чем может быть преимущество?
Какая разница для потока? Мы же с консоли читаем.

А преимущество разве что в более быстрых и простых преобразованиях на строках.
Да и в контексте сишарпа String'и всё равно в utf16 хранятся.

«Зря место расходует» — это было актуально 20 лет назад :)
И мы говорим о C#'а, а тут GC и «зря оперативную память расходует» :)

На совр. компьютерах особой разницы между utf'ами нету. Дело вкуса чисто.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:45
Цитата: Алексей Гринь от апреля 27, 2010, 18:26
Цитата: myst от апреля 27, 2010, 18:25
Нуль-терминаторы же через байт. ;)
И?
Что и? Ты ему скармливаешь строку в UTF-16, а он считывает только первый байт и успокаивается.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 18:47
Цитата: myst от апреля 27, 2010, 18:45
Что и? Ты ему скармливаешь строку в UTF-16, а он считывает только первый байт и успокаивается.
А можно было спроектировать не per ano. Если у эмулятора консоли можно изменить кодировку — то почему нельзя сделать так, чтобы при смене на utf16 он кушал по два байта?
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 27, 2010, 18:55
Цитата: Алексей Гринь от апреля 27, 2010, 18:16
А почему нельзя задать родную для винды utf16?
Цитата: Алексей Гринь от апреля 27, 2010, 18:21
Неужели они не сделали никаких костылей в ЭМУЛЯТОРЕ консоли для поддержки родного utf16, который внутри кишок винды сидит (даже ascii-функции все к нему же переводятся!) Странно...
По-моему, они вообще не развивали консоль дальше возможностей, присутствующих в «железном» текстовом режимие.

Хотя да, в потоках ввода-вывода можно использовать любую кодировку — хоть и utf-32 (big endian, low endian). А вот в самом сценарии работает лишь то, что можно смешивать с ASCII - национальные восьмибитки, utf-8. 
Например,
echo aı lʌv ju:nıkoʊd >>output.txt
в кодировке utf-16 превратится в чередованиe латинских букв с нулевыми байтами, а utf-8 не будет для данной команды ничем принципиально отличаться от ansi.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 18:59
Цитата: Алексей Гринь от апреля 27, 2010, 18:47
Цитата: myst от апреля 27, 2010, 18:45
Что и? Ты ему скармливаешь строку в UTF-16, а он считывает только первый байт и успокаивается.
А можно было спроектировать не per ano. Если у эмулятора консоли можно изменить кодировку — то почему нельзя сделать так, чтобы при смене на utf16 он кушал по два байта?
Это ты у меня спрашиваешь? :o Наверное, потому что тяжёлое детство, деревянные иг C.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 19:01
Чтобы оставить совместимость и в то же время ввести новую фичу — есть кучи способов. В  Microsoft забили на консоли просто. Поэтому ставьте мону под Линукс, и там ваши поделия на C# заведутся без проблем ;)

Цитата: Python от апреля 27, 2010, 18:55
в кодировке utf-16 превратится в чередованиe латинских букв с нулевыми байтами, а utf-8 не будет для данной команды ничем принципиально отличаться от ansi.
А BOM на что?
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 19:02
Цитата: Python от апреля 27, 2010, 18:55
Хотя да, в потоках ввода-вывода можно использовать любую кодировку — хоть и utf-32 (big endian, low endian).
Каналы в ввода-вывода вообще не имеют кодировки. Это просто последовательность байтов. Как их интерпретировать — дело программы.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 19:03
Цитата: Алексей Гринь от апреля 27, 2010, 19:01
В  Microsoft забили на консоли просто.
Я скачал их эту, которая power. Она должна уметь уникод.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 27, 2010, 19:13
Цитата: Алексей Гринь от апреля 27, 2010, 19:01
А BOM на что?
В utf-8 — по всей видимости, лишь для того, чтобы мешать. Начальная строка сценария, содержащая этот самый BOM, воспринимается как ошибочная, хотя можно либо убрать его вручную в более-менее примитивном редакторе, либо пропустить первую строку.
В утф-16, по всей видимости, то же самое, с той разницей, что он полностью несовместим с аѕсіі со всеми вытекающими последствиями.
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 27, 2010, 19:16
Вы знаете, что в настоящей кошерной консоли можно хоть картинки показывать?
Название: C#.Консоль.Кодировка
Отправлено: Demetrius от апреля 27, 2010, 19:17
Цитата: Python от апреля 27, 2010, 19:13
Цитата: Алексей Гринь от апреля 27, 2010, 19:01
А BOM на что?
В utf-8 — по всей видимости, лишь для того, чтобы мешать. Начальная строка сценария, содержащая этот самый BOM, воспринимается как ошибочная, хотя можно либо убрать его вручную в более-менее примитивном редакторе, либо пропустить первую строку.
В UTF-8 не может быть BOM. В UTF-8 та ваша последовательность символов не маркирует порядок байтов, следовательно, это не BOM, а велосипед.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 19:17
В utf8 он не нужен, да, ибо там порядок байт фикисиррованный (хотя позволяет чётко идентифицировать поток как utf8), но cmd.exe-таки и мог бы распознавать utf16-BOM в .bat'ах, чтобы верно перенастраиваться и не читать "как ansi" и не встречать "внезапных" null'ей. Я про это.

Цитата: Python от апреля 27, 2010, 18:55
Хотя да, в потоках ввода-вывода можно использовать любую кодировку — хоть и utf-32 (big endian, low endian). А вот в самом сценарии работает лишь то, что можно смешивать с ASCII - национальные восьмибитки, utf-8. 
Например,
Код: [Выделить]echo aı lʌv ju:nıkoʊd >>output.txtв кодировке utf-16 превратится в чередованиe латинских букв с нулевыми байтами, а utf-8 не будет для данной команды ничем принципиально отличаться от ansi.

Да и в принципе определять utf16 можно и без бома, просто посмотреть частнотность нулей через раз. Короче опять не "проблема" со всем. cmd.exe это не command.com, он делался уже когда прикрутили уникод и прочий кошер.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 27, 2010, 19:18
Цитата: RawonaM от апреля 27, 2010, 19:16
Вы знаете, что в настоящей кошерной консоли можно хоть картинки показывать?
Если речь идет не о псевдографике, то тоже хочу себе такую)
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 19:21
Я смотрел видео в псевдографике :)
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 27, 2010, 19:27
Цитата: Python от апреля 27, 2010, 19:18
Цитата: RawonaM от апреля 27, 2010, 19:16
Вы знаете, что в настоящей кошерной консоли можно хоть картинки показывать?
Если речь идет не о псевдографике, то тоже хочу себе такую)
Так в эмуляторе терминала в иксах есть, берите.
Вот например "текстовый" браузер:
(wiki/en) W3m (http://en.wikipedia.org/wiki/W3m)
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 27, 2010, 19:28
Цитата: Алексей Гринь от апреля 27, 2010, 19:21
Я смотрел видео в псевдографике :)
:D Где можно посмотреть?
Хочу "Аватар" в псевдографике.  :yes:
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 27, 2010, 19:32
Цитата: RawonaM от апреля 27, 2010, 19:28
Где можно посмотреть?
Хочу "Аватар" в псевдографике.  :yes:
Блин, уже точно не помню, в общем специальный плагин к какому-то проигрывателю... Было мегавырвиглазно (почему-то разрешение я не мог настроить), что-либо различить можно было если отойти от монитора и старательно вглядываться :)

Википедия:
ЦитироватьВ мультимедийном проигрывателе MPlayer существует поддержка aalib, позволяющая выводить видео в режиме ASCII. В оболочке для мультимедийного проигрывателя XINE, xine-ui также присутствует возможность смотреть видео в ASCII (для этого видео запускается через отдельную команду aaxine).

Вроде бы это.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 27, 2010, 20:29
Цитата: RawonaM от апреля 27, 2010, 19:16
Вы знаете, что в настоящей кошерной консоли можно хоть картинки показывать?
Ещё бы она существовала. Я видел, что там Линуксах, они тоже забили на консоль.
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 27, 2010, 22:57
Цитата: myst от апреля 27, 2010, 20:29
Цитата: RawonaM от апреля 27, 2010, 19:16
Вы знаете, что в настоящей кошерной консоли можно хоть картинки показывать?
Ещё бы она существовала. Я видел, что там Линуксах, они тоже забили на консоль.
w3m же работает с графикой. Какие траблемы?

Видео в реальном текстовом режиме:






(этот смотреть в середине)


Идея ясна, но я уверен, что есть более красивые примеры.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 28, 2010, 03:20
Цитата: RawonaM от апреля 27, 2010, 22:57
Идея ясна, но я уверен, что есть более красивые примеры.
Зачем это нужно?
Какой смысл показывать картинки или видео в консоли? Я не вижу в этом ничего «кошерного», вижу только выпендрёж.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 28, 2010, 07:47
Вот это извращение, вот это я понимаю. ;up:
Расскажите этим товарищам про фреймбуферную консоль.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 28, 2010, 10:30
Цитата: myst от апреля 28, 2010, 07:47;up:
:down:
Кстати, использование консоли для реализации графического интерфейса (например, FAR) — не меньшее извращение.
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 28, 2010, 10:46
Цитата: Тайльнемер от апреля 28, 2010, 03:20
Цитата: RawonaM от апреля 27, 2010, 22:57
Идея ясна, но я уверен, что есть более красивые примеры.
Зачем это нужно?
Какой смысл показывать картинки или видео в консоли? Я не вижу в этом ничего «кошерного», вижу только выпендрёж.
Это две несвязанные темы. Есть консоль, поддерживающая настоящую графику (я дал ссылку на скриншот).
А графика в ASCII коде действительно извращение, но она может где-то пригодиться, думаю.

Цитата: Тайльнемер от апреля 28, 2010, 10:30
Цитата: myst от апреля 28, 2010, 07:47;up:
:down:
Кстати, использование консоли для реализации графического интерфейса (например, FAR) — не меньшее извращение.
Ага, Norton Commander - извращение...) Эх, молодежь...
Кстати есть хороший клон Norton Commander-а для Линукс: Midnight Commander, может кто не знал. Иногда удобно.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 28, 2010, 10:50
Зачем?
Цитата: RawonaM от апреля 28, 2010, 10:46
Есть консоль, поддерживающая настоящую графику
По-моему, консоль здесь — лишняя субстанция.
Цитата: RawonaM от апреля 28, 2010, 10:46
Ага, Norton Commander - извращение...) Эх, молодежь...
Когда ничего, кроме консоли нет, то NC — это костыль, а иначе — да, извращение.
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 28, 2010, 10:54
Цитата: Тайльнемер от апреля 28, 2010, 10:50
Зачем?
Цитата: RawonaM от апреля 28, 2010, 10:46
Есть консоль, поддерживающая настоящую графику
По-моему, консоль здесь — лишняя субстанция.
Скорость работы, расход памяти и т.п. Бывает нужно зайти на какой-то сайт с консоли, до этого я пользовался lynx-ом, а этим намного приятнее. Иногда бывает нужно увидеть какую-то картинку или перейти по нужной картинке, чтобы что-то скачать. Для этого грузить тяжелый браузер? Ничего лишнего.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 29, 2010, 20:03
Цитата: Тайльнемер от апреля 28, 2010, 10:30
Кстати, использование консоли для реализации графического интерфейса (например, FAR) — не меньшее извращение.
Вообще да, извращение. Но пользуемся:

1) Большинство графических файл-браузеров не имеют встроенной консоли. Делать cd и многие другие операции удобнее через интерфейс, но для некоторых действий необходима конслоль, в которой можно задать параметры команды и увидеть результат вывода.
2) Большинство графических файл-браузеров ориентированы на работу преимущественно с мышью — NC-подобные оболочки шире используют клавиатурные команды. Скорость возрастает.
3) В случае загрузки системы без графической оболочки, удобнее иметь хоть какой-то визуальный интерфейс, чем вообще ничего.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 29, 2010, 20:06
Цитата: Python от апреля 29, 2010, 20:03
1) Большинство графических файл-браузеров не имеют встроенной консоли. Делать cd и многие другие операции удобнее через интерфейс, но для некоторых действий необходима конслоль, в которой можно задать параметры команды и увидеть результат вывода.
Я прикрутил шелл на Ctrl-B у Тотала для этого.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 29, 2010, 20:32
Вообще, в мышино-ориентированных GUI двухпанельность — тоже в какой-то степени извращение. Основные межпанельные действия проще делать перетягиванием из одного окна в другое, и окон может быть больше двух (либо в роли одного из окон выступает декстоп). Мне лично больше всего нравится такой подход, как в Dolphin: графический файл-браузер с одной панелью файлов и возможностью включить консоль для более продвинутых действий. Жаль, чего-то похожего для Windows пока не видел.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 29, 2010, 20:37
К сожалению, у виндовой консоли есть один страшный недостаток: команды из стандартного набора не работают с utf-8 в именах файлов, хотя юникодовские имена разрены.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 29, 2010, 22:38
Цитата: Python от апреля 29, 2010, 20:32
Основные межпанельные действия проще делать перетягиванием из одного окна в другое
При перекрываемых окнах — нифига не проще.
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 29, 2010, 22:45
Цитата: Python от апреля 29, 2010, 20:03
2) Большинство графических файл-браузеров ориентированы на работу преимущественно с мышью — NC-подобные оболочки шире используют клавиатурные команды. Скорость возрастает.
Цитата: Python от апреля 29, 2010, 20:32Основные межпанельные действия проще делать перетягиванием из одного окна в другое
Что-то вы сами себе противоречите.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 01:08
Цитата: RawonaM от апреля 29, 2010, 22:45
Что-то вы сами себе противоречите.
Нет, идея в том, что есть два разных типа визуальных интерфейсов: двухпанельные, где все можно делать через клавиатуру, и многооконные, где основные действия выполняются без участия клавиатуры; каждый тип имеет свои преимущества и недостатки. Скорость работы с первыми достигается за счет использования достаточно большого количества клавишных комбинаций. Скорость вторых — за счет сведения к минимуму всех действий с клавиатурой. Переходы руки от мыши к клавиатуре и обратно замедляют работу, поэтому их желательно свести к минимуму. Но поскольку даже мышиный интерфейс требует работы с клавиатурой (например, при переименовании файлов), такой переход неизбежен — в этом отношении, двухпанельники удобнее. С другой стороны, когда работать приходится с тремя папками и более одновременно, удобнее, если количество окон не ограничивается двумя, но в этом случае копирование файлов одним нажатием клавиши становится невозможным.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 01:10
Цитата: Алексей Гринь от апреля 29, 2010, 22:38
При перекрываемых окнах — нифига не проще.
В винде окна можно упорядочивать.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от апреля 30, 2010, 05:29
Цитата: Python от апреля 29, 2010, 20:03
2) Большинство графических файл-браузеров ориентированы на работу преимущественно с мышью — NC-подобные оболочки шире используют клавиатурные команды. Скорость возрастает.
Этот пункт никак не связан с типом интерфейса (консольный/графический)
Название: C#.Консоль.Кодировка
Отправлено: RawonaM от апреля 30, 2010, 08:31
Цитата: Python от апреля 30, 2010, 01:08С другой стороны, когда работать приходится с тремя папками и более одновременно, удобнее, если количество окон не ограничивается двумя, но в этом случае копирование файлов одним нажатием клавиши становится невозможным.
В Тотале есть вкладки с каждой стороны, так что хоть триста папок, все можно быстро с клавиатуры сделать.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 09:46
Цитата: Алексей Гринь от апреля 29, 2010, 22:38
Цитата: Python от апреля 29, 2010, 20:32
Основные межпанельные действия проще делать перетягиванием из одного окна в другое
При перекрываемых окнах — нифига не проще.
Полное говно.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 09:47
Цитата: Python от апреля 30, 2010, 01:10
Цитата: Алексей Гринь от апреля 29, 2010, 22:38
При перекрываемых окнах — нифига не проще.
В винде окна можно упорядочивать.
Пральна, угробим время на упорядочивание.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 09:48
Цитата: Python от апреля 29, 2010, 20:37
юникодовские имена разрены
Это поддержка прямых слэшей теперь так называется? :o
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 09:50
На самом деле нужен двухрежимный файловый менеджер. Однопанельный — для любования картинками, двухпанельный — для копирования/перемещения. Естественно, оба режима должны настраиваться индивидуально.
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от апреля 30, 2010, 10:25
Цитата: myst от апреля 30, 2010, 09:50
На самом деле нужен двухрежимный файловый менеджер
+hэкатОн. Было бы ещё круто переключение объединить с рабочими столами, т.е. режим настраивается на рабочий стол, внизу на панели как в Гноме — переключалка.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 14:40
Цитата: myst от апреля 30, 2010, 09:47
Пральна, угробим время на упорядочивание.
Если это делается парой кликов, то почему бы и не угробить?
Цитата: myst от апреля 30, 2010, 09:50
Это поддержка прямых слэшей теперь так называется?
А это тут при чем? Я имел в виду, что юникодовские имена файлов разрешены в самой дисковой системе, т.е., мы можем создать через интерфейс Windows файл, содержащий практически любые юникодовские символы, но стандартные команды командной строки (copy, type, ren и под.) попросту не смогут с таким файлом работать.

Хотя нет, вру. Команды из стандартного набора все же могут работать с такими именами, если запустить их непосредственно через Пуск -> Выполнить..., введя инструкцию cmd /C требуемая команда. Правда, не очень представляю, как это впихнуть в .bat
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 14:50
Цитата: myst от апреля 30, 2010, 09:50
На самом деле нужен двухрежимный файловый менеджер. Однопанельный — для любования картинками, двухпанельный — для копирования/перемещения. Естественно, оба режима должны настраиваться индивидуально.
Я бы предпочел однопанельник/многооконник со встроенной консолью и расширенными возможностями клавиатуры, максимально приближенными к возможностям двухпанельников. Например, при вызове клавишной комбинации для копирования файлов должен появляться диалог, предлагающий скопировать файлы в одно из открытых окон по выбору пользователя.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 15:22
Цитата: Python от апреля 30, 2010, 14:50
Например, при вызове клавишной комбинации для копирования файлов должен появляться диалог, предлагающий скопировать файлы в одно из открытых окон по выбору пользователя.
Ога, ну о-очень эффективное решение.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 15:24
Цитата: Python от апреля 30, 2010, 14:40
А это тут при чем?
Ни при чём, я очитался.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 15:26
Цитата: Python от апреля 30, 2010, 14:40
Цитата: myst от апреля 30, 2010, 09:47
Пральна, угробим время на упорядочивание.
Если это делается парой кликов, то почему бы и не угробить?
Пару кликов тут,
Пару кликов там,
Рабочий день закончился,
А воз и ныне там.
:smoke:
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 15:41
Цитата: myst от апреля 30, 2010, 15:26
Пару кликов тут,
Пару кликов там,
Рабочий день закончился,
А воз и ныне там.
Не играйте в сапер в рабочее время!
Цитата: myst от апреля 30, 2010, 15:22
Ога, ну о-очень эффективное решение.
Хорошо, какие у него недостатки?
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 16:08
Цитата: Python от апреля 30, 2010, 15:41
Не играйте в сапер в рабочее время!
Не, с Сапёром будут ночевать на работе. :yes:

Цитата: Python от апреля 30, 2010, 15:41
Хорошо, какие у него недостатки?
Тот самый диалог, очевидно же. Любой диалог — тормоза. Возможно, ковыряющей в носу секретутке эти тормоза некритичны... :eat:
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 16:24
Цитата: myst от апреля 30, 2010, 16:08
Любой диалог — тормоза.
Смотря какой диалог. Если это дерево каталогов, которое нужно прокручивать и прокликивать от самого корня до целевой папки, то это не просто тормоза, а мегатормоза. Ну а если в диалоге подтверждения копирования (который все равно появляется!) добавить пару дополнительных строчек для выбора одной из нескольких открытых целей, то особых тормозов я здесь не вижу.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 17:08
Цитата: Python от апреля 30, 2010, 16:24
Ну а если в диалоге подтверждения копирования (который все равно появляется!) добавить пару дополнительных строчек для выбора одной из нескольких открытых целей, то особых тормозов я здесь не вижу.
Во-первых, диалог подтверждения не нужен, так как все, кто более-менее освоился в системе, соглашаются автоматом. Во-вторых, одно дело — машинально нажимать Enter, и совсем другое — делать сознательный выбор.
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 17:32
Если открытых окон только два, то копирование возможно лишь в одну цель — получится абсолютно то же самое, что и в случае с двухпанельником. Ну а если окон три и более, программа должна помнить последнюю цель копирования из текущего окна и по умолчанию предлагать ее. Таким образом, при множественных операциях можно точно так же машинально нажимать Enter.
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 18:03
Цитата: Python от апреля 30, 2010, 17:32
Таким образом, при множественных операциях можно точно так же машинально нажимать Enter.
Таким образом можно лишь острых ощущений на ровном месте отхватить. Машинальные и сознательные операции нельзя смешивать. Надеюсь, не надо объяснять почему.
Для разгребания каталога-помойки по N другим каталогам нормальным решением было бы назначение каждому приёмнику отдельного сочетания клавиш (например, F6+1,2,..., или по первым буквам названия каталога (я в курсе, что они могут совпадать), или по псевдониму).
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 18:13
Цитата: myst от апреля 30, 2010, 18:03
Для разгребания каталога-помойки по N другим каталогам нормальным решением было бы назначение каждому приёмнику отдельного сочетания клавиш (например, F6+1,2,..., или по первым буквам названия каталога (я в курсе, что они могут совпадать), или по псевдониму).
Вполне можно реализовать в рамках диалога подтверждения/выбора цели.
Или имеется в виду N отдельных клавиш для копирования, доступных постоянно?
Название: C#.Консоль.Кодировка
Отправлено: myst от апреля 30, 2010, 18:38
Цитата: Python от апреля 30, 2010, 18:13
Вполне можно реализовать в рамках диалога подтверждения/выбора цели.
Вполне можно ходить на корточках, но зачем?
Процесс должен быть «Отправить туда-то», а не «Отправить. Куда? Туда».
Название: C#.Консоль.Кодировка
Отправлено: Python от апреля 30, 2010, 22:07
Цитата: myst от апреля 30, 2010, 18:38
Процесс должен быть «Отправить туда-то», а не «Отправить. Куда? Туда».
ІМНО, дело вкуса. Выбор целевой папки во второй панели тоже создает определенную задержку.
Название: C#.Консоль.Кодировка
Отправлено: myst от мая 6, 2010, 12:58
Цитата: Python от апреля 30, 2010, 22:07
Цитата: myst от апреля 30, 2010, 18:38
Процесс должен быть «Отправить туда-то», а не «Отправить. Куда? Туда».
ІМНО, дело вкуса. Выбор целевой папки во второй панели тоже создает определенную задержку.
Вкладки решают. Если им присвоить номера, будет вообще шикарно. Надо Гислеру подсказать эту идею, если он ещё сам не догадался...
Название: C#.Консоль.Кодировка
Отправлено: Python от мая 6, 2010, 15:43
Все равно в половине случаев (например, при редактировании отдельного файла) вторая панель только загромождает пространство, тем самым уменьшая размер панели, в которой приходится работать .
Название: C#.Консоль.Кодировка
Отправлено: Алексей Гринь от мая 6, 2010, 22:04
Цитата: Python от мая  6, 2010, 15:43
Все равно в половине случаев (например, при редактировании отдельного файла) вторая панель только загромождает пространство, тем самым уменьшая размер панели, в которой приходится работать .
Кнопку нажал и убрал вторую панель.
Название: C#.Консоль.Кодировка
Отправлено: myst от мая 7, 2010, 11:40
Цитата: Python от мая  6, 2010, 15:43
Все равно в половине случаев (например, при редактировании отдельного файла) вторая панель только загромождает пространство, тем самым уменьшая размер панели, в которой приходится работать .
Вот поэтому и должно быть два режима.
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от мая 8, 2010, 13:47
ЦитироватьВот поэтому и должно быть два режима.
А в каком двухпанельном файловом менеджере не два режима?
Название: C#.Консоль.Кодировка
Отправлено: myst от мая 8, 2010, 20:10
А как в Total Commander'е их переключать?
Название: C#.Консоль.Кодировка
Отправлено: Тайльнемер от мая 10, 2010, 03:08
Значит, долой тотал.
Название: C#.Консоль.Кодировка
Отправлено: Michael Glazunov от мая 10, 2010, 12:18
Цитата: Тайльнемер от мая 10, 2010, 03:08
Значит, долой тотал.

Да здравствует bash!  :)