Можно ли предоставить ввод Unicode в консольное приложение и прочитать символ / строку Unicode через Console.ReadKey ()?
Я знаю, что Unicode работает при чтении ввода другими методами, но, к сожалению, мне нужно использовать функцию «перехвата», предоставляемую ReadKey.
Обновлять:
При вставке символа Unicode, такого как U + 03BB (λ), в консоль, считываются 3 ключа.
Пытался посмотреть, кодировка ли это какая-то, но ничего не вижу.





Объект ConsoleKeyInfo, возвращаемый Console.ReadKey (), имеет свойство KeyChar, содержащее символ Unicode нажатой клавиши или комбинации клавиш (если клавиша или комбинация клавиш имеют эквивалент Unicode). Так...
char c = Console.ReadKey().KeyChar;
Вы получите символ '\ 0', если ключ не имеет эквивалента в Юникоде (например, функциональная клавиша).
При необходимости вы можете использовать StringBuilder для объединения этих символов в строку Unicode.
К сожалению, Console.ReadKey может обрабатывать только события клавиатуры. События клавиатуры могут представлять только те вещи, которые можно вводить на клавиатуре (с использованием реальных и «виртуальных» клавиш, определенных в перечислении ConsoleKey). Таким образом, при использовании ReadKey вы получите только две вещи: необработанный код клавиши, который соответствует клавише на клавиатуре, и переведенный символ, который является символом Unicode, которому необработанный код клавиши сопоставляется на кодовой странице ввода консоли (и каждая кодовая страница может отображать максимум 256 символов). Вы не можете прочитать какие-либо другие типы данных (а именно символы, которые нельзя ввести напрямую и / или не имеют сопоставления во входной кодовой странице) с помощью ReadKey.
Более того, когда вы вставляете символ Unicode в консоль, API, используемый ReadKey, пытается преобразовать символ в последовательность Windows ALT + nnn (т. Е. Удерживая нажатой клавишу ALT и введите номер кодовой точки на клавиатуре). К сожалению, он сначала переводит символ, используя правила, определенные для входной кодовой страницы, поэтому даже если вы восстановите номер кодовой точки, вы не получите фактический символ, который был вставлен, вы получите любой символ, который кодовая страница отображает его. к.
Причина, по которой все это работает при использовании Read или ReadLine, заключается в том, что это методы, основанные на потоках, а не на клавиатуре. Очевидно, что любой символ может войти через поток ввода, поскольку не происходит перевода клавиатуры и кодовой страницы. Но вы не можете получить доступ к входному потоку напрямую, используя ReadKey, только клавиатуру (и если входной поток был перенаправлен откуда-то, кроме клавиатуры, ReadKey завершится ошибкой).
Если вы вручную используете консольный API с P / Invoke, может быть какой-то способ реплицировать функцию «перехвата» ReadKey с использованием входного потока, но это было бы нетривиально, и консоль на самом деле не предназначена для таких вещей. так что вы, вероятно, будете бороться с этим всю дорогу.
Обновлено: все, что было сказано, вы все равно можете реализовать свои собственные комбинации клавиш, чтобы разрешить ввод символов Unicode с клавиатуры - например, введите CTRL + ALT + U, а затем четыре шестнадцатеричных цифры - ваша процедура ReadKey может обнаруживать CTRL + ALT + U, а затем возьмите следующие четыре нажатия клавиши, сделайте из них int и преобразуйте его в char - но, конечно, это не позволит вставить.
Просто случайно узнал, что он на самом деле работает на 64-битной Win7. Странный.
é дает 130 (его значение IBM-850) вместо 233 (U + 00E9), и это перекликается со знаком вопроса - тогда как ReadLine() правильно перекликается с é и дает 233).
Это просто странно. IIRC Я тестировал 32-битную версию, вероятно, Vista.
Сейчас протестировал то же самое на 64-битной Win7, чертовски работает!
Так что либо Vista, либо 32-битная ошибка.
Кто-нибудь может подтвердить это?
Да, этого можно было ожидать, но он не возвращает Unicode, работает только для ASCII.