Чтение Юникода с помощью консоли.Клавиша чтения

StackOverflow https://stackoverflow.com/questions/325516

  •  11-07-2019
  •  | 
  •  

Вопрос

Возможно ли предоставить ввод в формате Юникод в консольное приложение и прочитать символ / строку Юникода через консоль.ReadKey()?

Я знаю, что Unicode работает при чтении входных данных с помощью других методов, но, к сожалению, мне нужно использовать функцию "перехвата", предоставляемую ReadKey.

Обновить:

При вставке символа Юникода, такого как U+03BB (λ), в консоль считываются 3 клавиши.

  1. Alt + Цифровая панель 1
  2. Alt + Цифровая панель 1
  3. Alt + Цифровая панель 8

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

Это было полезно?

Решение 3

Теперь это просто странно.IIRC мое тестирование проводилось на 32-разрядной версии, вероятно, Vista.

Теперь протестировал то же самое на 64-разрядной версии Win7, чертова штука работает!

Так что либо ошибка Vista, либо 32-разрядная версия.

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

Другие советы

К сожалению, консоль.ReadKey способен обрабатывать только события клавиатуры.События клавиатуры могут представлять только то, что можно ввести на клавиатуре (используя реальные и "виртуальные" клавиши, определенные в перечислении ConsoleKey).Таким образом, при использовании ReadKey вы получите только две вещи:необработанный код клавиши, который соответствует клавише на клавиатуре, и переведенный символ, который является символом Юникода, которому необработанный код клавиши соответствует на кодовой странице ввода консоли (а каждая кодовая страница может отображать максимум 256 символов).Вы не можете прочитать любой другой тип данных (а именно символы, которые не могут быть введены напрямую и / или не имеют сопоставления на странице ввода кода) с помощью ReadKey.

Более того, когда вы вставляете символ Юникода в консоль, API, используемый ReadKey, пытается преобразовать символ в последовательность Windows ALT + nnn (т. Е., удерживая нажатой клавишу ALT, введите номер кодовой точки на клавиатуре).К сожалению, сначала он переводит символ, используя правила, определенные для кодовой страницы ввода, поэтому, даже если вы восстановите номер кодовой точки, вы не получите фактический символ, который был вставлен, вы получите любой символ, которому соответствует кодовая страница.

Причина, по которой все это работает при использовании Read или ReadLine, заключается в том, что это методы, основанные на потоке, а не на клавиатуре.Очевидно, что любой символ вообще может поступать через поток ввода, поскольку не происходит перевода клавиатуры и кодовой страницы.Но вы не можете получить доступ к входному потоку напрямую, используя ReadKey, только клавиатуру (и если входной поток был перенаправлен откуда-то еще, кроме клавиатуры, ReadKey сразу завершится неудачей).

Возможно, существует какой-то способ воспроизвести функциональность "перехвата" ReadKey с использованием входного потока, если вы вручную используете консольный API с помощью P / Invoke, но это было бы нетривиально, а консоль на самом деле не предназначена для выполнения подобных действий, так что вы, вероятно, боролись бы с этим весь путь.


Редактировать:Все это говорит о том, что вы все еще можете реализовать свои собственные комбинации клавиш, позволяющие вводить символы Юникода с клавиатуры - например, введите CTRL + ALT + U, а затем четыре шестнадцатеричные цифры - ваша процедура ReadKey может обнаружить CTRL + ALT + U, а затем использовать следующие четыре нажатия клавиш, создать из них int и преобразовать его в символ - но, конечно, это не позволит выполнять вставку.

Объект ConsoleKeyInfo, возвращаемый Console.ReadKey() имеет свойство с именем KeyChar, содержащее символ Юникода нажатой клавиши или комбинации клавиш (если клавиша или комбинация клавиш имеет эквивалент в Юникоде).Итак...

char c = Console.ReadKey().KeyChar;

Вы получите символ '\0', если ключ не имеет эквивалента в Юникоде (например, функциональная клавиша).

Вы можете использовать StringBuilder для объединения этих символов вместе в строку Unicode, если это необходимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top