Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

C#.Консоль.Кодировка

Автор Тайльнемер, апреля 26, 2010, 18:21

0 Пользователи и 1 гость просматривают эту тему.

Тайльнемер

Может кто-то в курсе, как поставить уникод на входном потоке консоли в дот-нетовском консольном приложении?

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


Но если написать
Console.InputEncoding = Encoding.UTF8;
string s = Console.ReadLine();

то при вводе строки хотя бы с одним не-ASCII-шным символом s присваевается null.

myst

Хм... Я всегда стандартными каналами пользовался, и с ними вроде не было проблем. :donno:
:??? Или я с Жабой путаю?..

myst

А ведь давным-давно я наступал на эти грабли. Эх, я уже не помню, но точно решаемо.

Тайльнемер

Цитата: myst от апреля 26, 2010, 18:57
Я всегда стандартными каналами пользовался, и с ними вроде не было проблем.
А это они и есть:
Цитата: MSDNConsole Class Represents the standard input, output, and error streams for console applications.
Или не  они?

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

(Вообще странно как-то: вывод работает, командная строка тоже, а ввод — не хочет)

myst

Цитата: Тайльнемер от апреля 26, 2010, 20:03
Или не  они?
Я, просто, основательно библиотеку Шарпа. :)

Цитата: Тайльнемер от апреля 26, 2010, 20:03
Может, у вас что-то сохранилось, где грабли обойдены?
Сейчас поищу...

myst

Кстати, а зачем UTF-8 в консоли?
По логике вещей надо выставлять кодировку консоли.

myst

Например, у меня в консоли 1251, и работает код:

Console.InputEncoding = Encoding.GetEncoding(1251);
string s = Console.ReadLine();
Console.WriteLine(s);

myst

Если читать из файла с кодировкой UTF-8, должно быть всё нормально.

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

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

Console.InputEncoding = Encoding.UTF8;

Тайльнемер

Цитата: 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?

arseniiv

А там же не консоль, а параметр командной строки. Он разве не особенно обрабатывается? Правда, никогда не знал что допускаются юникодные параметры командной строки... :???

myst

Цитата: Тайльнемер от апреля 26, 2010, 20:32
А как такое возможно, если кодировка консоли — 1251?
:donno: Могу лишь сказать, что в XP консоль китайскую грамоту точно не понимает. :)

myst

Цитата: arseniiv от апреля 27, 2010, 13:56
А там же не консоль, а параметр командной строки.
Чо-чо?

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

Цитата: arseniiv от апреля 27, 2010, 13:56
Правда, никогда не знал что допускаются юникодные параметры командной строки... :???
Утро доброе, Windows NT уникод искаропки умеет с незапамятных времён.

arseniiv

Я имел ввиду, что параметры командной строки передаются в программу иначе, чем ввод какой-нибудь после запуска

Python

Цитата: Тайльнемер от апреля 26, 2010, 20:32
А как такое возможно, если кодировка консоли — 1251?
На самом деле в консоли используется другая кодировка кириллицы — cp866. Впрочем, тоже восьмиразрядная.

Непосредственно в консоли, думаю, не получится (хотя линукс, вроде бы, позволяет нечто подобное). Но если создать .bat в формате utf-8 и в нем использовать юникодовские символы в командах, а вывод перенаправить в файл, то, по идее, этот файл будет содержать текст в кодировке utf-8.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

myst

Цитата: arseniiv от апреля 27, 2010, 17:42
Я имел ввиду, что параметры командной строки передаются в программу иначе, чем ввод какой-нибудь после запуска
Капитан Очевидность в ярости, но я всё равно не понял смысл этого:
Цитата: arseniiv от апреля 27, 2010, 13:56
А там же не консоль, а параметр командной строки.
Слово консоль здесь что означает?

myst

Цитата: Python от апреля 27, 2010, 17:54
На самом деле в консоли используется другая кодировка кириллицы — cp866.
На самом деле это настраивается. У меня 1251, например.

myst

Цитата: Python от апреля 27, 2010, 17:54
Но если создать .bat в формате utf-8 и в нем использовать юникодовские символы в командах, а вывод перенаправить в файл, то, по идее, этот файл будет содержать текст в кодировке utf-8.
Windows'овский интерпретатор команд умеет UTF-8? :o

Алексей Гринь

Есть код:
Цитировать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

Кактус!
肏! Τίς πέπορδε;

Python

Цитата: myst от апреля 27, 2010, 18:01
Windows'овский интерпретатор команд умеет UTF-8?
В именах файлов точно не умеет. Но с утф8 в потоках ввода-вывода, вроде бы, работает.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Алексей Гринь

肏! Τίς πέπορδε;

myst

Цитата: Python от апреля 27, 2010, 18:07
Но с утф8 в потоках ввода-вывода, вроде бы, работает.
Команды обработки текста не latin-1 понимают? Если нет, значит не поддерживает.

myst


Алексей Гринь

Цитата: myst от апреля 27, 2010, 18:18
ЦитироватьА почему нельзя задать родную для винды utf16?
В консоли? :o
Хм. Utf8 не пугает, а utf16 пугает? А в чём разница? Неужели они не сделали никаких костылей в ЭМУЛЯТОРЕ консоли для поддержки родного utf16, который внутри кишок винды сидит (даже ascii-функции все к нему же переводятся!) Странно...
肏! Τίς πέπορδε;

myst

Цитата: Алексей Гринь от апреля 27, 2010, 18:21
Цитата: myst от апреля 27, 2010, 18:18
ЦитироватьА почему нельзя задать родную для винды utf16?
В консоли? :o
Хм. Utf8 не пугает, а utf16 пугает? А в чём разница?
single-byte vs. double-byte. :)

Алексей Гринь

肏! Τίς πέπορδε;

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр